Bash脚本对目录中的所有文件执行命令

有人可以提供代码来执行以下操作:假设有一个文件目录,所有这些都需要通过程序运行。 程序将结果输出到标准输出。 我需要一个将进入目录的脚本,对每个文件执行命令,并将输出连接成一个大的输出文件。

例如,要在一个文件上运行命令:

$ cmd [option] [filename] > results.out 

下面的bash代码将传递$ file到命令,其中$ file将代表/ dir中的每个文件

 for file in /dir/* do cmd [option] "$file" >> results.out done 

 el@defiant ~/foo $ touch foo.txt bar.txt baz.txt el@defiant ~/foo $ for i in *.txt; do echo "hello $i"; done hello bar.txt hello baz.txt hello foo.txt 

这个怎么样:

 find /some/directory -maxdepth 1 -type f -exec cmd option {} \; > results.out 
  • -maxdepth 1参数防止发现recursion-maxdepth 1任何子目录。 (如果你想要这样的嵌套目录得到处理,你可以省略这个)
  • -type -f指定只处理纯文件。
  • -exec cmd option {}告诉它为每个find的文件使用指定的option运行cmd ,文件名被replace为{}
  • \; 表示命令的结束。
  • 最后,所有单独的cmd执行的输出被redirect到results.out

但是,如果你关心处理文件的顺序,你最好写一个循环。 我认为find处理inode顺序的文件(虽然我可能是错误的),这可能不是你想要的。

我正在通过命令行在我的覆盆子pi上执行以下操作:

 for i in *;do omxplayer "$i";done 

基于@Jim Lewis的方法:

这是一个快速的解决scheme,使用find和sorting文件的修改date:

 $ find directory/ -maxdepth 1 -type f -print0 | \ xargs -r0 stat -c "%y %n" | \ sort | cut -d' ' -f4- | \ xargs -d "\n" -I{} cmd -op1 {} 

有关分类,请参阅

http://www.commandlinefu.com/commands/view/5720/find-files-and-list-them-sorted-by-modification-time

我需要将所有.md文件从一个目录复制到另一个目录,所以这就是我所做的。

for i in **/*.md;do mkdir -p ../docs/"$i" && rm -r ../docs/"$i" && cp "$i" "../docs/$i" && echo "$i -> ../docs/$i"; done

这是非常难以阅读,所以让我们分解。

首先用你的文件cd进入目录,

for i in **/*.md; 为您的模式中的每个文件

mkdir -p ../docs/"$i"在包含文件的文件夹之外的文档文件夹中创build该目录。 这将创build一个与该文件具有相同名称的额外文件夹。

rm -r ../docs/"$i"删除由于mkdir -p创build的额外文件夹

cp "$i" "../docs/$i"复制实际文件

echo "$i -> ../docs/$i"回声你做了什么

; done 从此过着幸福快乐的生活