AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-220462

Porcupine's questions

Martin Hope
Porcupine
Asked: 2025-01-13 14:29:22 +0800 CST

区域设置:无法获取正确日期(本周日)

  • 7
  • 我昨天晚上(德国时间周日午夜之前)做了以下事情:

  • 今天的日期

$ LC_TIME="en.GB.UTF8" date --iso-8601
2025-01-12
  • 今天的日期(星期几
$ LC_TIME="en.GB.UTF8" date +%u
7

$ LC_TIME="en.GB.UTF8" date +%a
Sun

问题

  • 由于一周从周一到周日开始,因此本周周一应该是 2025-01-06
$ LC_TIME="en_GB.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_IE.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_IN.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_US.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_DE.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_JP.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_DK.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_CA.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_AU.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13

另一个观察

我今天(2025-01-13)做了这件事(在德国)

$ LC_TIME="en_AU.UTF-8" date -d "this-week-sunday" --iso-8601
2025-01-19
$ LC_TIME="en_AU.UTF-8" date -d "last-week-sunday" --iso-8601
2025-01-12
$ LC_TIME="en_AU.UTF-8" date -d "next-week-sunday" --iso-8601
2025-01-26

问题

因此,今天它似乎给出了部分正确的结果。今天的输出有什么问题:如果昨天的输出this-week-monday是2025-01-13这样的,计算机不知何故在每个地区都将星期日算作一周的第一天(我上面显示的)。所以"this-week-sunday"应该是昨天而不是 2025-01-19(如今天所示)。

概括

昨天

$ LC_TIME="en_GB.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13

今天

env -i bash --norc --noprofile
bash-5.2$ LC_TIME="en_AU.UTF-8" date -d "this-week-sunday" --iso-8601
2025-01-19

问题:如果昨天(2025-01-12,星期日)this-week-monday是 13 号,那么今天this-week-sunday应该是昨天而不是2025-01-19 为什么我得到错误的日期输出?

bash
  • 1 个回答
  • 181 Views
Martin Hope
Porcupine
Asked: 2024-05-09 23:38:11 +0800 CST

printf - 将格式化的字符串输出存储在变量中

  • 11

而不是以下内容

printf '%s\t%s\t%s\t%s\n' 'index' 'podcast' 'website' 'YouTube'

我想将 printf 输出存储在 Results 变量中,我该怎么做?

bash
  • 1 个回答
  • 458 Views
Martin Hope
Porcupine
Asked: 2024-05-07 04:27:53 +0800 CST

jq 跳过 null 迭代

  • 8

我用的是jq 1.7

数据

我正在对 yt-dlp 下载的 info.json 进行操作

yt-dlp --write-info-json --skip-download https://www.youtube.com/watch?v=vlIO-7Rpi7c

JQ-任务

  • 现在我想删除字幕中名称不是的所有数组de,en-US并在其中de选择en-US所有带有 element 的对象ext == vtt。

这成功地工作如下:

jq 'pick(.subtitles | .de[],."en-US"[] | select (.ext == "vtt")) | del(..|nulls)' *.json

输出

{
  "subtitles": {
    "de": [
      {
        "ext": "vtt",
        "url": "https://www.youtube.com/api/timedtext?v=vlIO-7Rpi7c&ei=JS05ZoT2Ftf0i9oP8dy4mAo&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1715048341&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=AB2ECEEABF48D1A16ADC7ACCB8A072D63EE12DCC.5F56904251766FB68624A68FF2BBB57B9CCFFD2F&key=yt8&lang=de&fmt=vtt",
        "name": "German"
      }
    ],
    "en-US": [
      {
        "ext": "vtt",
        "url": "https://www.youtube.com/api/timedtext?v=vlIO-7Rpi7c&ei=JS05ZoT2Ftf0i9oP8dy4mAo&caps=asr&opi=112496729&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1715048341&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=AB2ECEEABF48D1A16ADC7ACCB8A072D63EE12DCC.5F56904251766FB68624A68FF2BBB57B9CCFFD2F&key=yt8&lang=en-US&fmt=vtt",
        "name": "English (United States)"
      }
    ]
  }
}

问题

对于某些Youtube视频,json文件不包含“en-US”而是包含“en”,而有些则包含de、en、en-US这三个。所以我写了以下内容

jq 'pick(.subtitles | .de[],.en[],."en-US"[] | select (.ext == "vtt")) | del(..|nulls)' *.json

错误

jq: 错误 (at:69): 无法迭代 null (null)

需要帮助

如果 json 文件中并非所有这些语言都存在,如何仅选择 .ext == "vtt" 仅适用于 en、en-US、de 语言?

array
  • 1 个回答
  • 255 Views
Martin Hope
Porcupine
Asked: 2024-05-06 22:18:00 +0800 CST

AWK:作为变量传递时不处理正则表达式

  • 5

有什么建议么?我读到:转义序列(GNU Awk 用户指南)

代表例

$ Filesystem='/dev/mapper/vgubuntu-Media'
$ FilesystemRegex="$(echo "${Filesystem}" | sed "s~/~\\\/~g")"
$ echo "$FilesystemRegex"
\/dev\/mapper\/vgubuntu-Media
$ df -H "${Filesystem}" | awk -v Regex="${FilesystemRegex}" '/$Regex/{print $5}'
awk: warning: escape sequence `\/' treated as plain `/'
$ df -H "${Filesystem}" | awk '/\/dev\/mapper\/vgubuntu-Media/{print $5}'  
62%
bash
  • 2 个回答
  • 88 Views
Martin Hope
Porcupine
Asked: 2024-01-08 02:32:17 +0800 CST

lsblk:为什么 FSSIZE 不等于 FSAVAIL + FSUSED

  • 5
sudo lsblk --fs -o NAME,FSTYPE,SIZE,FSSIZE,FSUSED,FSAVAIL,FSUSE%,MOUNTPOINTS,LABEL,PATH | grep -v '^loop'

NAME                    FSTYPE       SIZE FSSIZE FSUSED FSAVAIL FSUSE% MOUNTPOINTS    LABEL          PATH
zram0                                  8G                              [SWAP]                        /dev/zram0
nvme0n1                              1.8T                                                            /dev/nvme0n1
├─nvme0n1p1             ext4         768M                                                            /dev/nvme0n1p1
├─nvme0n1p2             ext4         768M 738.4M 240.9M  443.8M    33% /boot          FedoraBoot     /dev/nvme0n1p2
├─nvme0n1p3             ext4         768M                                             UnassignedBoot /dev/nvme0n1p3
├─nvme0n1p4             vfat         128M 127.7M  22.4M  105.3M    18% /boot/efi      EFI-SP         /dev/nvme0n1p4
└─nvme0n1p5             LVM2_member  1.8T                                                            /dev/nvme0n1p5
  ├─vgubuntu-FedoraRoot ext4         100G  98.1G  47.9G   45.2G    49% /              FedoraRoot     /dev/mapper/vgubuntu-FedoraRoot
  ├─vgubuntu-FedoraSwap swap          32G                              [SWAP]                        /dev/mapper/vgubuntu-FedoraSwap
  ├─vgubuntu-UbuntuSwap swap          32G                                                            /dev/mapper/vgubuntu-UbuntuSwap
  ├─vgubuntu-UbuntuRoot ext4          50G                                                            /dev/mapper/vgubuntu-UbuntuRoot
  ├─vgubuntu-UbuntuHome ext4          18G                                                            /dev/mapper/vgubuntu-UbuntuHome
  ├─vgubuntu-FedoraHome ext4          18G  17.5G   6.5G   10.1G    37% /home          FedoraHome     /dev/mapper/vgubuntu-FedoraHome
  ├─vgubuntu-Data       ext4         100G  98.1G    82G   11.6G    84% /mnt/Data      Data           /dev/mapper/vgubuntu-Data
  ├─vgubuntu-Documents  ext4         250G   245G 208.5G     24G    85% /mnt/Documents Documents      /dev/mapper/vgubuntu-Documents
  ├─vgubuntu-Media      ext4         500G 491.1G 331.2G  134.8G    67% /mnt/Media     Media          /dev/mapper/vgubuntu-Media
  └─vgubuntu-Backup     ext4         100G  97.9G   9.1G   83.7G     9% /mnt/Backup    Backup         /dev/mapper/vgubuntu-Backup

filesystems
  • 1 个回答
  • 19 Views
Martin Hope
Porcupine
Asked: 2023-10-04 04:26:48 +0800 CST

如果从另一个脚本执行,则更改 bash 脚本的行为

  • 5

我有一个脚本(例如Task.sh)(具有可执行权限):

伪代码:

if [[ Not called from inside a script ]]; then
  echo 'Not called from inside a script'
else
  echo 'Called from a script'
fi

我有一个脚本Main.sh(具有可执行权限):

Value=$(Task.sh)
echo "${Value}"

预期结果

$ Task.sh
Not called from inside a script

$ Main.sh
Called from a script

帮助请求

请建议在伪代码中添加什么条件Task.sh

bash
  • 2 个回答
  • 48 Views
Martin Hope
Porcupine
Asked: 2023-07-14 03:15:59 +0800 CST

将多行输出存储在单独的变量中

  • 5

脚本输出 3 行输出:

$ Filename /a/Resource/.Filename.man.markdown
.Filename.man.markdown
.Filename
man.markdown

我想做的事

我想将 3 行输出存储在单独的变量中,我该怎么做?


我尝试了以下方法 - 为什么失败以及如何正确执行?

第一次失败的尝试

Filename /a/Resource/.Filename.man.markdown | IFS=$'\n' read -r File1 Filename1 Extension1
echo "$File1 $Filename1 $Extension1"

第二次失败的尝试

$ IFS=$'\n' read -r File1 Filename1 Extension1 < <(Filename /a/Resource/.Filename.man.markdown)
$ echo "$File1 $Filename1 $Extension1"
.Filename.man.markdown  
bash
  • 1 个回答
  • 36 Views
Martin Hope
Porcupine
Asked: 2022-05-25 11:51:34 +0800 CST

在文件中匹配模式的下一行的开头追加一个字符

  • 0

测试文件:

cat Test.txt
#EXTM3U

#EXTINF:100
a.flac

#EXTINF:20
b.flac

预期结果

cat Test.txt
#EXTM3U

#EXTINF:100
#a.flac

#EXTINF:20
#b.flac

实验一

sed -e '/^#EXTINF/a #'  Test.txt
#EXTM3U

#EXTINF:100
#
a.flac

#EXTINF:20
#
b.flac

建议?

我的实验在 append 之后添加了一个新行#,我不希望添加那个新行。

bash sed
  • 2 个回答
  • 40 Views
Martin Hope
Porcupine
Asked: 2022-03-01 11:51:10 +0800 CST

删除字符串中第一个字母 ([a-zA-Z]) 之前的所有字符

  • 0

我想删除所有字符,直到[a-zA-Z] 字符串中的第一个字母。例如:

#121Abc-->Abc

%Ab#c-->Ab#c

Ab#c-->Ab#c

Abc-->Abc

1Abc-->Abc

1 21Abc-->Abc

1^1 Abc-->Abc

注意:所有非字母都包括非印刷字符。

bash工具可以吗?

bash text-processing
  • 5 个回答
  • 1317 Views
Martin Hope
Porcupine
Asked: 2022-01-06 08:51:40 +0800 CST

来自`util-linux`而不是来自`bsdmainutils`的`column`

  • 0

column可在包util-linux和bsdmainutils. 这两个软件包都安装在 Linux Mint 20.2 中

$ type column
column is /usr/bin/column
column is /bin/column

这两个列都指向 bsd 列工具。我如何访问该工具util-linux?

linux-mint columns
  • 2 个回答
  • 311 Views
Martin Hope
Porcupine
Asked: 2021-11-20 05:23:48 +0800 CST

bash脚本中的`type`命令,未显示所有路径

  • 0

当我echo "${PATH}" | tr -s ':' '\n' | nl从 bash 脚本中键入并在终端上时,我得到相同的结果:

     1  /home/nikhil/Documents/Git/Cs/Architecture/bin
     2  /home/nikhil/.local/bin
     3  /home/nikhil/opt/.nvm/versions/node/v16.13.0/bin
     4  /home/nikhil/opt/bin
     5  /usr/local/sbin
     6  /usr/local/bin
     7  /usr/sbin
     8  /usr/bin
     9  /sbin
    10  /bin
    11  /usr/games
    12  /usr/local/games
    13  /snap/bin
    14  /home/linuxbrew/.linuxbrew/bin
    15  /home/linuxbrew/.linuxbrew/sbin
    16  /home/nikhil/.cargo/bin
    17  /home/nikhil/.cabal/bin
    18  /home/nikhil/opt/go/bin
    19  /home/nikhil/.ruby/bin
    20  /home/linuxbrew/.linuxbrew/opt/fzf/bin

但是当我在 bash 脚本和终端上键入以下内容时,我会得到不同的结果:

# From Terminmal
$ type pandoc
pandoc is aliased to `/usr/bin/pandoc'
pandoc is /usr/bin/pandoc
pandoc is /home/linuxbrew/.linuxbrew/bin/pandoc
pandoc is /home/nikhil/.cabal/bin/pandoc
# From inside bash script
pandoc is /usr/bin/pandoc

为什么typebashscript 内部和终端的输出不同?如何使 bash 脚本type输出与终端的输出相同?

bash shell-script
  • 1 个回答
  • 128 Views
Martin Hope
Porcupine
Asked: 2020-02-28 05:28:47 +0800 CST

dconf 编辑器值与 gsettings 获取值不同

  • 4

我做了如下:

$ gsettings get org.gnome.desktop.session idle-delay
uint32 300

$ gsettings set org.gnome.desktop.session idle-delay 80

$ gsettings get org.gnome.desktop.session idle-delay
uint32 80

但是当我这样做时:dconf dump /org/gnome/,我看到如下:

$ dconf dump /org/gnome/desktop/session
[/]
idle-delay=uint32 60

观察:dconf dump显示真实值,但gsettings显示新值但与 dconf-editor 显示的不同

重启后

$ dconf dump /org/gnome/desktop/session
[/]
idle-delay=uint32 60

$ gsettings get org.gnome.desktop.session idle-delay
uint32 300

观察:dconf dump显示真实值,但gsettings显示默认值


这是否意味着它gsettings不能在我的系统上运行?如果是这样,我该如何解决这个问题?

linux gnome
  • 1 个回答
  • 866 Views
Martin Hope
Porcupine
Asked: 2020-01-25 10:45:22 +0800 CST

Bash:仅当另一个命令(具有另一个特定模式)失败时才运行命令(具有特定模式)

  • 0

我有一个 shell 脚本,它为每个 Markdown 文件创建一个函数(在 bashscript 文件中.bashrc),以便在编辑器中打开它。

例子:

ls /home/nikhil/Notes/Studies
Physics.md
Chemistry.md
Studies.md
index.md

ls /home/nikhil/Notes/Sports
Football.md
Cricket.md
index.md

如您所见,某些文件夹(例如 Studies)包含同名文件(Studies.md)和 index.md,而其他文件夹(例如 Sports)包含 index.md 但不包含 Sports.md

现在,我的 bashscript 创建以下函数

oPhysics(){ ${Editor:-vim} /home/nikhil/Notes/Studies/Physics.md }
oChemistry(){ ${Editor:-vim} /home/nikhil/Notes/Studies/Chemistry.md }
oStudies(){ ${Editor:-vim} /home/nikhil/Notes/Studies/Studies.md }
oiStudies(){ ${Editor:-vim} /home/nikhil/Notes/Studies/index.md }

oFootball(){ ${Editor:-vim} /home/nikhil/Notes/Sports/Football.md}
oCricket(){ ${Editor:-vim} /home/nikhil/Notes/Sports/Cricket.md}
oiSports(){ ${Editor:-vim} /home/nikhil/Notes/Sports/index.md}

注意:oStudiesandoiStudies存在,while 只oiSports存在。

应用

现在,作为用户,我想输入oStudiesor oSports(这会失败)而不是oiSports,它应该在函数不存在oiSports时自动运行。oSports这是因为,大多数时候用户对打开正常的 markdown 文件感兴趣,只有当它们不存在时用户才想打开index.md. 用户不记得只有 index.md 存在于哪个文件夹(例如 Sports 文件夹)。

我怎样才能做到这一点?我正在寻找的模式是在不存在的情况下运行一个函数oiBlahBlah,oBlahBlah因为它oBlahBlah是由用户调用的。


回复建议

制作别名不起作用,因为我不想oStudies执行oiStudies

environment-variables bash
  • 2 个回答
  • 54 Views
Martin Hope
Porcupine
Asked: 2020-01-22 15:45:04 +0800 CST

查找 exec sh:Shell 变量未传递给 subshel​​l

  • 5

.md这是一个简化的代码,如果它包含与父目录和扩展名相同的文件名,则打印目录的名称。

FIND(){
    find . -type d -exec sh -c '
        for d do
            [ -f "${d}/${d##*/}.md" ] && printf "%s\n" "$d"
        done' find-sh {} +
}


FIND

概括地说,我想将搜索词${d}/${d##*/}.md作为参数发送给FIND函数,但不幸的是,这不会输出任何内容:

FIND(){
    local SearchTerm="${1}"
    find . -type d -exec sh -c '
        for d do
            [ -f "${SearchTerm}" ] && printf "%s\n" "$d"
        done' find-sh {} +
}

FIND '${d}/${d##*/}.md'

我确信 . 的引用存在一些问题SearchTerm。有什么提示吗?


我试过了:FIND '\${d}/\${d##*/}.md'但没有输出

bash quoting
  • 3 个回答
  • 701 Views
Martin Hope
Porcupine
Asked: 2019-11-18 13:39:22 +0800 CST

多行变量在每个换行符之前添加一个制表符

  • 0

下面的代码片段使用了一个自定义函数 HexNewLine,它基本上转换了 hexdump 并在字符处中断 0x0a

$ echo -e "\t{
>   "dependencies": {
>     "prettier": {
>       "version": "1.18.2",
>       "from": "[email protected]",
>       "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz"
>     }
>   }
> }" | HexNewLine

00000000   09 7b 0a                                           '.{.'
0000000a   20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 3a 20    '  dependencies: '
0000001a   7b 0a                                              '{.'
0000001c   20 20 20 20 70 72 65 74 74 69 65 72 3a 20 7b 0a    '    prettier: {.'
0000002c   20 20 20 20 20 20 76 65 72 73 69 6f 6e 3a 20 31    '      version: 1'
0000003c   2e 31 38 2e 32 2c 0a                               '.18.2,.'
00000043   20 20 20 20 20 20 66 72 6f 6d 3a 20 70 72 65 74    '      from: pret'
00000053   74 69 65 72 40 31 2e 31 38 2e 32 2c 0a             '[email protected],.'
00000060   20 20 20 20 20 20 72 65 73 6f 6c 76 65 64 3a 20    '      resolved: '
00000070   68 74 74 70 73 3a 2f 2f 72 65 67 69 73 74 72 79    'https://registry'
00000080   2e 6e 70 6d 6a 73 2e 6f 72 67 2f 70 72 65 74 74    '.npmjs.org/prett'
00000090   69 65 72 2f 2d 2f 70 72 65 74 74 69 65 72 2d 31    'ier/-/prettier-1'
000000a0   2e 31 38 2e 32 2e 74 67 7a 0a                      '.18.2.tgz.'
000000aa   20 20 20 20 7d 0a                                  '    }.'
000000b0   20 20 7d 0a                                        '  }.'
000000b4   7d 0a                                              '}.'
  • 现在我tr用来在换行符后添加一个制表符,但没有任何反应!
$ echo -e "\t{
>   "dependencies": {
>     "prettier": {
>       "version": "1.18.2",
>       "from": "[email protected]",
>       "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz"
>     }
>   }
> }" | tr '\n' '\n\t'
        {
  dependencies: {
    prettier: {
      version: 1.18.2,
      from: [email protected],
      resolved: https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz
    }
  }
}
bash
  • 1 个回答
  • 898 Views
Martin Hope
Porcupine
Asked: 2019-11-07 12:41:23 +0800 CST

来源 Bash 脚本,每个都有 main 函数

  • 1

我正在使用 Bash 4.4.20。我通常在每个 bashscript 中都有 main 函数。如果我想从另一个 bash 脚本中的另一个函数获取这个脚本,这会与两个脚本中的主函数定义冲突吗?

#A.sh
main() {
SomeFunction 
}

SomeFunction(){
. B.sh
}

main "$@"
#B.sh

main(){
echo Hi
}

main "$@"

有没有不重命名主要功能的解决方案?

bash
  • 2 个回答
  • 6482 Views
Martin Hope
Porcupine
Asked: 2019-09-16 09:34:00 +0800 CST

防止 bashscript 参数被转移到子源脚本

  • 0

我在另一个 bashscript (Parent) 中获取一个 bashscript (Child),位于 Parent 中间的某个位置。执行时传递给 Parent 的参数会传递给 Child。如何防止这种行为?我不希望父母的论点也转移给孩子。

注意:父子类比不是关于父子过程,而是关于先于另一个的东西。

此外,我想拥有源脚本的父脚本环境(传递给它的参数除外)。这是因为,脚本参数的默认值不同。请参见下面的示例。 父脚本使用源脚本中定义的一些函数,并且源脚本创建父脚本正在使用的数组。另外,在获取子脚本后,我需要父脚本的位置参数。

#!/usr/bin/env bash
# - goal: "Parent"

main() {
    # # Path
    #dScriptP="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"

    # # Argument
    ParentArgument=${1:-40}
    echo "ParentArgument=${ParentArgument}"
    . Child.sh

}

main "$@"
#!/bin/false
# shellcheck shell=bash
# - goal: "Child"

main() {
    # # Path
    #dScriptP="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"

    # # Argument
    ChildArgument=${1:-30}
    echo "ChildArgument=${ChildArgument}"
}

main "$@"
$ ./Parent.sh 50
ParentArgument=50
ChildArgument=50

期望的输出

$ ./Parent.sh 50
ParentArgument=50
ChildArgument=30
bash
  • 2 个回答
  • 372 Views
Martin Hope
Porcupine
Asked: 2019-09-12 03:46:24 +0800 CST

查找:用变量替换表达式

  • 0
$ find -name "Bik*"
./Biking
./Biking/Unsync/Biking.md.~6~
./Biking/Rendered/Biking.gen.html
./Biking/Biking.md

现在,当我用变量替换表达式时,如下所示:

$ a='-name "Bik*"'

$ find $a

我没有输出。为什么会这样?应该修改什么?

find
  • 1 个回答
  • 60 Views
Martin Hope
Porcupine
Asked: 2019-08-07 08:40:11 +0800 CST

仅查找包含与文件夹同名的文件的文件夹

  • 7

我想找到所有包含同名(和扩展名.md)的降价文件的子文件夹。

例如:我想查找以下子文件夹:

Apple/Banana/Orange      #Apple/Banana/Orange/Orange.md exists
Apple/Banana             #Apple/Banana/Banana.md exists
Apple/Banana/Papaya      #Apple/Banana/Papaya/Papaya.md exists
  • 注意:目录中可以有其他文件或子目录。

有什么建议么?


可以使用以下代码测试问题的解决方案:

#!/usr/bin/env bash
# - goal: "Test"
# - author: Nikhil Agarwal
# - date: Wednesday, August 07, 2019
# - status: P T' (P: Prototyping, T: Tested)
# - usage: ./Test.sh
# - include:
#   1.
# - refer:
#   1. [directory - Find only those folders that contain a File with the same name as the Folder - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/534190/find-only-those-folders-that-contain-a-file-with-the-same-name-as-the-folder)
# - formatting:
#   shellcheck disable=
#clear

main() {
    TestData
    ExpectedOutput
    TestFunction "${1:?"Please enter a test number, as the first argument, to be executed!"}"
}

TestFunction() {
    echo "Test Function"
    echo "============="
    "Test${1}"
    echo ""
}

Test1() {
    echo "Description: Thor"
    find . -type f -regextype egrep -regex '.*/([^/]+)/\1\.md$' | sort
    echo "Observation: ${Green:=}Pass, but shows filepath instead of directory path${Normal:=}"
}

Test2() {
    echo "Description: Kusalananda1"
    find . -type d -exec sh -c '
    dirpath=$1
    set -- "$dirpath"/*.md
    [ -f "$dirpath/${dirpath##*/}.md" ] && [ "$#" -eq 1 ]' sh {} \; -print | sort
    echo "Observation: ${Red:=}Fails as it ignores B.md${Normal:=}"
}

Test3() {
    echo "Description: Kusalananda2"
    find . -type d -exec sh -c '
    for dirpath do
        set -- "$dirpath"/*.md
        if [ -f "$dirpath/${dirpath##*/}.md" ] && [ "$#" -eq 1 ]
        then
            printf "%s\n" "$dirpath"
        fi
    done' sh {} + | sort
    echo "Observation: ${Red:=}Fails as it ignores B.md${Normal:=}"
}

Test4() {
    echo "Description: steeldriver1"
    find . -type d -exec sh -c '[ -f "$1/${1##*/}.md" ]' find-sh {} \; -print | sort
    echo "Observation: ${Green:=}Pass${Normal:=}"
}

Test5() {
    echo "Description: steeldriver2"
    find . -type d -exec sh -c '
  for d do
    [ -f "$d/${d##*/}.md" ] && printf "%s\n" "$d"
  done' find-sh {} + | sort
    echo "Observation: ${Green:=}Pass${Normal:=}"
}

Test6() {
    echo "Description: Stéphane Chazelas"
    find . -name '*.md' -print0 \
        | gawk -v RS='\0' -F/ -v OFS=/ '
    {filename = $NF; NF--
     if ($(NF)".md" == filename) include[$0]
     else exclude[$0]
    }
    END {for (i in include) if (!(i in exclude)) print i}'
    echo "Observation: ${Red:=}Fails as it ignores B.md${Normal:=}"
}

Test7() {
    echo "Description: Zach"
    #shellcheck disable=2044
    for fd in $(find . -type d); do
        dir=${fd##*/}
        if [ -f "${fd}/${dir}.md" ]; then
            ls "${fd}/${dir}.md"
        fi
    done
    echo "Observation: ${Green:=}Pass but shows filepath instead of directory${Normal:=}"
}
ExpectedOutput() {
    echo "Expected Output"
    echo "==============="
    cat << EOT
./GeneratedTest/A
./GeneratedTest/A/AA
./GeneratedTest/B
./GeneratedTest/C/CC1
./GeneratedTest/C/CC2
EOT
}

TestData() {
    rm -rf GeneratedTest

    mkdir -p GeneratedTest/A/AA
    touch GeneratedTest/index.md
    touch GeneratedTest/A/A.md
    touch GeneratedTest/A/AA/AA.md

    mkdir -p GeneratedTest/B
    touch GeneratedTest/B/B.md
    touch GeneratedTest/B/index.md

    mkdir -p GeneratedTest/C/CC1
    touch GeneratedTest/C/index.md
    touch GeneratedTest/C/CC1/CC1.md

    mkdir -p GeneratedTest/C/CC2
    touch GeneratedTest/C/CC2/CC2.md

    mkdir -p GeneratedTest/C/CC3
    touch GeneratedTest/C/CC3/CC.md

    mkdir -p GeneratedTest/C/CC4
}
main "$@"
find directory
  • 6 个回答
  • 1141 Views
Martin Hope
Porcupine
Asked: 2019-07-22 04:07:38 +0800 CST

将一组 bash 命令传递给 bash 函数

  • 0

我想传递以下一组 bash 命令

{ echo Apple; echo Banana; }

作为 bash 函数的参数,定义.bashrc如下:

BashFunction(){
"$@" | SomeOtherFunction
}
BashFunction '{ echo Apple; echo Banana; }'

但我得到这个错误:

{ echo Apple; echo Banana; }: command not found

如果我从 bash 函数中删除引号

BashFunction(){
$@ | SomeOtherFunction
}

然后我得到这个错误

{: command not found
bash pipe
  • 1 个回答
  • 163 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve