J. Doe Asked: 2018-07-03 11:44:29 +0800 CST2018-07-03 11:44:29 +0800 CST 2018-07-03 11:44:29 +0800 CST 在所有类似文件上运行 Bash while 循环 772 我想在 Bash 中编写一个 while 循环,该循环运行在以下形式的文件的所有实例上 {number}.tst 例如,, 1.tst, 2.tst....50.tst 我不希望它在文件上运行tst.tst。 我该怎么写这个?我想我将需要一个布尔短语并[0-9]*在其中的某个地方,但我对语法并不完全确定。 scripts bash 4 个回答 Voted Best Answer steeldriver 2018-07-03T11:51:27+08:002018-07-03T11:51:27+08:00 如果您只需要像您的示例一样排除字母名称,则tst.tst可以使用简单的 shell glob for f in [0-9]*.tst; do echo "$f"; done 使用 bash扩展 glob(应在 Ubuntu 中默认启用) 给定 $ ls *.tst 1.tst 2.tst 3.tst 4.tst 50.tst 5.tst bar.tst foo.tst then+([0-9])表示一个或多个十进制数字: for f in +([0-9]).tst; do echo "$f"; done 1.tst 2.tst 3.tst 4.tst 50.tst 5.tst 您可以使用检查是否启用了扩展通配符shopt extglob,并在必要时使用shopt -s extglob(并使用取消设置set -u extglob)进行设置。 WinEunuuchs2Unix 2018-07-03T11:55:00+08:002018-07-03T11:55:00+08:00 从此堆栈溢出答案:列出名称中只有数字的文件: find . -regex '.*/[0-9]+\.tst' 或者 当你想对文件做一些事情时,使用 find 也有好处,例如使用内置的-exec,-print0和管道到xargs -0甚至(使用 Bash): while IFS='' read -r -d '' file do # ... done < <(find . -regex '.*/[0-9]+\.tst' -print0) 如果文件名以数字开头,请注意此处的其他答案我包含的文件不是数字。此处发布的答案没有。例如: $ ls *.tst 12tst.tst 1.tst 2.tst $ find . -maxdepth 1 -regex '.*/[0-9]+\.tst' ./1.tst ./2.tst 注意:使用-maxdepth 1参数仅列出当前目录而不是子目录中的编号文件。 wjandrea 2018-07-03T11:56:41+08:002018-07-03T11:56:41+08:00 在这种情况下,没有 {number}{non-number}.tst 形式的文件名,因此一种可能的解决方案是包含所有以数字开头的文件名: for filename in [0-9]*.tst; do echo "$filename" # Example command done waltinator 2018-07-03T16:28:49+08:002018-07-03T16:28:49+08:00 如果您想按数字顺序处理文件,可以使用seq命令 (read man seq)。 for i in $( seq 1 50 ) ; do echo "Process ${i}.txt" done
如果您只需要像您的示例一样排除字母名称,则
tst.tst
可以使用简单的 shell glob使用 bash扩展 glob(应在 Ubuntu 中默认启用)
给定
then
+([0-9])
表示一个或多个十进制数字:您可以使用检查是否启用了扩展通配符
shopt extglob
,并在必要时使用shopt -s extglob
(并使用取消设置set -u extglob
)进行设置。从此堆栈溢出答案:列出名称中只有数字的文件:
或者
当你想对文件做一些事情时,使用 find 也有好处,例如使用内置的
-exec
,-print0
和管道到xargs -0
甚至(使用 Bash):如果文件名以数字开头,请注意此处的其他答案我包含的文件不是数字。此处发布的答案没有。例如:
注意:使用
-maxdepth 1
参数仅列出当前目录而不是子目录中的编号文件。在这种情况下,没有 {number}{non-number}.tst 形式的文件名,因此一种可能的解决方案是包含所有以数字开头的文件名:
如果您想按数字顺序处理文件,可以使用
seq
命令 (readman seq
)。