2012-05-09 112 views
163

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

例如,要在1个文件运行以下命令:

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

我想补充的问题。可以用xargs完成吗?例如, 'ls | xargs cmd [options] {filenames由xargs自动放在这里} [更多参数]> results.out' –

+0

它可以,但你可能[不想使用'ls'](http://mywiki.wooledge。 org/ParsingLs)来驱动'xargs'。如果cmd完全胜任,也许你可以简单地使用'cmd '。 – tripleee

回答

244

以下的bash代码将传递$文件命令,其中$文件将表示在每一文件/目录

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

[email protected] ~/foo $ touch foo.txt bar.txt baz.txt 
[email protected] ~/foo $ for i in *.txt; do echo "hello $i"; done 
hello bar.txt 
hello baz.txt 
hello foo.txt 
+13

如果'/ dir /'中没有文件存在,那么该循环仍然会为'$ file'运行一次,值为'*',这可能是不可取的。为避免这种情况,请在循环的持续时间内启用nullglob。在循环'shopt -s nullglob'之前添加此行,并在循环'shopt -u nullglob #revert nullglob恢复为正常默认状态'之后的此行。 –

+29

+1,它只是花了我我的整个壁纸集合。我后面的每个人都使用双引号。 “$ file” – Behrooz

+0

如果输出文件在循环内部是相同的,那么在循环'done> results.out'之外重定向效率会更高(并且可能会覆盖而不是附加,就像我在这里假设的那样)。 – tripleee

112

如何:

find /some/directory -maxdepth 1 -type f -exec cmd option {} \; > results.out 
  • -maxdepth 1参数可防止递归下降到 任何子目录找到。 (如果你想要这样的嵌套目录得到处理,你可以省略这个。)
  • -type -f指定只处理纯文件。
  • -exec cmd option {}告诉它运行cmd与每个文件的指定option发现,有用于{}
  • \;取代的文件名表示所述命令的结束。
  • 最后,所有的个体cmd执行输出重定向到 results.out

然而,如果你关心这些文件的处理顺序,你 可能会更好编写循环。我认为find以inode顺序处理文件 (尽管我可能错了),这可能不是您想要的 。

+1

这是处理文件的正确方法。由于许多原因,使用for循环容易出错。也可以通过使用其他命令来完成排序,例如'stat'和'sort',这些顺序依赖于什么是排序标准。 – tuxdna

+0

如果我想运行两个命令,我将如何在'-exec'选项后链接它们?我必须用单引号或其他东西包装它们吗? – frei

+0

'find'始终是最好的选择,因为您可以使用选项'-name'通过文件名模式进行过滤,并且您可以使用单个命令进行过滤。 –

22

我在命令行我树莓派这样运行:

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

我需要复制所有文件.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"使一个文档文件夹目录中包含文件夹之外。这会创建一个与该文件具有相同名称的额外文件夹。

rm -r ../docs/"$i"删除作为mkdir -p

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

echo "$i -> ../docs/$i"回声你做了什么快乐地生活后

; done不断

1

一个快速的结果产生的额外文件夹而有时完成工作的肮脏的方式是:

例如,要查找所有文件中的线在当前目录中的号码,你可以这样做:

find . | xargs wc -l 
相关问题