在目录中为每个文件运行Shell脚本

7

我有一个文件夹里有许多文件,它们都以“YYYY_MM_DD”命名。

-rw-r--r-- 1 root root 480K Apr 21 13:17 2012_04_05
-rw-r--r-- 1 root root 483K Apr 21 13:17 2012_04_06
-rw-r--r-- 1 root root 484K Apr 21 13:17 2012_04_07
-rw-r--r-- 1 root root 480K Apr 21 13:17 2012_04_08
-rw-r--r-- 1 root root 344K Apr 21 13:17 2012_04_09
-rw-r--r-- 1 root root  66K Apr 21 13:17 2012_04_10
-rw-r--r-- 1 root root 461K Apr 21 13:17 2012_04_11
-rw-r--r-- 1 root root 475K Apr 21 15:09 2012_04_17
-rw-r--r-- 1 root root 480K Apr 21 15:10 2012_04_18
-rw-r--r-- 1 root root 474K Apr 21 15:10 2012_04_19
-rw-r--r-- 1 root root 474K Apr 21 15:10 2012_04_20

我有一个shell脚本,它接受一个文件作为参数,并根据文件中的数据计算数字。我像这样调用脚本:

sh Calculate.sh MyFile

我想要在这个目录中为每个文件运行这个shell脚本。
我该怎么做呢?使用xargs吗?

find 命令可能是一个好的起点。以下是一些关于它的资源:http://www.grymoire.com/Unix/Find.html 和 http://mywiki.wooledge.org/UsingFind (随着时间的推移会变得更加复杂,但值得一看)。 - Telemachus
4个回答

7

你尝试过使用 find 命令来执行吗?

我的示例将会输出文件,但你也可以调用一个脚本,并将文件名作为参数传递。

find . -maxdepth 1 -type f -exec echo {} \;

这很酷,但我该如何将这些文件按顺序传递给我的Calculate.sh脚本? - general exception
2
好的,那么在调用脚本之前,您需要先整理好所有文件。尝试使用以下命令:find . -maxdepth 1 -type f | sort | xargs -I '{}' Calculate.sh '{}' - MrJames
我理解命令中的xargs部分,我知道sort将数据导入到xargs中,但是-I开关是什么意思?为什么有两个大括号'{}'?非常感谢。 - general exception
在使用-I时,可以指定一个替换字符串。'{}'在find命令中表示返回的当前文件名,但在xargs中它没有特殊含义,因为您可以通过 find . -maxdepth 1 -type f | sort | xargs -I 'recei_param' echo 'recei_param' 运行脚本,输出将是相同的。您可以在man xargs中查看更多详细信息。 - MrJames

6

在shell中的简单for循环:

for file in *; do sh Calculate.sh "$file"; done

如果Calculate.sh在同一目录下,这样做不也会在自身上运行吗? - ale10ander
1
是的,它会。为了避免这种情况,在bash中循环遍历所有未命名为Calculate.sh的文件:shopt extglob nullglob; for file in !(Calculate.sh) - glenn jackman

1

find . -maxdepth 1 -type f | xargs -n 1 -I % Calculate.sh %

找到当前目录下的所有文件,并逐个执行 Calculate.sh 脚本。


1
./Calculate.sh 2012_04_{05..20}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接