有人可能请提供代码来执行以下操作: 假设有一个文件目录,所有这些文件都需要通过程序运行。该程序将结果输出到标准输出。我需要一个将进入目录的脚本,对每个文件执行命令,并将输出连接成一个大输出文件。Bash脚本对目录中的所有文件执行命令
例如,要在1个文件运行以下命令:
$ cmd [option] [filename] > results.out
有人可能请提供代码来执行以下操作: 假设有一个文件目录,所有这些文件都需要通过程序运行。该程序将结果输出到标准输出。我需要一个将进入目录的脚本,对每个文件执行命令,并将输出连接成一个大输出文件。Bash脚本对目录中的所有文件执行命令
例如,要在1个文件运行以下命令:
$ cmd [option] [filename] > results.out
以下的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
如果'/ dir /'中没有文件存在,那么该循环仍然会为'$ file'运行一次,值为'*',这可能是不可取的。为避免这种情况,请在循环的持续时间内启用nullglob。在循环'shopt -s nullglob'之前添加此行,并在循环'shopt -u nullglob #revert nullglob恢复为正常默认状态'之后的此行。 –
+1,它只是花了我我的整个壁纸集合。我后面的每个人都使用双引号。 “$ file” – Behrooz
如果输出文件在循环内部是相同的,那么在循环'done> results.out'之外重定向效率会更高(并且可能会覆盖而不是附加,就像我在这里假设的那样)。 – tripleee
如何:
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顺序处理文件 (尽管我可能错了),这可能不是您想要的 。
基于@Jim刘易斯的做法:
这里是使用find
的快速解决方案,并且通过它们的修改日期对文件进行排序:
$ 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
我在命令行我树莓派这样运行:
for i in *;do omxplayer "$i";done
我需要复制所有文件.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
不断
一个快速的结果产生的额外文件夹而有时完成工作的肮脏的方式是:
例如,要查找所有文件中的线在当前目录中的号码,你可以这样做:
find . | xargs wc -l
我想补充的问题。可以用xargs完成吗?例如, 'ls | xargs cmd [options] {filenames由xargs自动放在这里} [更多参数]> results.out' –
它可以,但你可能[不想使用'ls'](http://mywiki.wooledge。 org/ParsingLs)来驱动'xargs'。如果cmd完全胜任,也许你可以简单地使用'cmd'。 –
tripleee