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
从此过着幸福快乐的生活