如何将当前和子目录中的所有文件作为命令参数附加?

时间:2009-12-02 23:01:53

标签: bash arguments directory-structure subdirectory

我有一个这样的目录:

dir
dir/somefile.txt
dir/subdir/subsub/somefile2.txt
dir/subdir2/somefile.txt

我希望在命令的单个实例中打开所有子目录中的所有文件。我尝试使用-exec或xargs进行查找,但这些文件使用单独的命令实例打开每个文件。

基本上,我想要的东西最终会像 kate dir/somefile.txt dir/subdir/subsub/somefile2.txt dir/subdir2/somefile.txt,但适用于任意数量的子目录中的任意数量的文件。我正在使用bash,但任何脚本建议都没问题。

澄清:我不只是指.txt文件,而是任何ascii文件(即.php,.txt,.html等等。)

4 个答案:

答案 0 :(得分:3)

有几种可能的选择。这些答案基于您的情况,您知道kate可以打开所有文件,并且您想要打开任何扩展名的文件。

find dir -type f -exec kate {} +  

kate $(find dir -type f)

kate `find dir -type f`

第二种和第三种形式几乎相同。主要区别[1]是第一个版本将处理名称中带有空格的文件,而第二个和第三个版本不会。

[1]感谢您指出NVRAM,我没有意识到我第一次发布答案时。

答案 1 :(得分:3)

尝试

kate `find . -name \*.txt -type f`

-type f阻止您访问目录。

以下是使用ls -1代替kate的示例:

edd@ron:~/src/debian/R$ ls -1 `find . -type f -name \*.txt`
./R-2.10.0/src/extra/graphapp/readme.txt
./R-2.10.0/src/extra/xdr/copyrght.txt
./R-2.10.0/src/extra/xdr/README.txt
./R-2.10.0/src/gnuwin32/fixed/etc/rgb.txt
./R-2.10.0/src/gnuwin32/installer/CustomMsg.txt
./R-2.10.0/src/library/grid/inst/doc/changes.txt
./R-2.10.0/src/unix/system.txt
./R-2.9.2-ra-1.2.8/src/extra/graphapp/readme.txt
./R-2.9.2-ra-1.2.8/src/extra/xdr/copyrght.txt
./R-2.9.2-ra-1.2.8/src/extra/xdr/README.txt
./R-2.9.2-ra-1.2.8/src/gnuwin32/fixed/etc/rgb.txt
./R-2.9.2-ra-1.2.8/src/gnuwin32/installer/CustomMsg.txt
./R-2.9.2-ra-1.2.8/src/library/grid/inst/doc/changes.txt
./R-2.9.2-ra-1.2.8/src/unix/system.txt
edd@ron:~/src/debian/R$

如果您真的想要子目录中的所有文件,则调用简化为

kate `find . -type f`

如果你在dir/或者

kate `find dir -type f`

答案 2 :(得分:2)

kate $(find dir -type f)

答案 3 :(得分:0)

您对xargs不是很熟悉,或者您没有正确使用它,因为您正在尝试做的是正是问题 xargs旨在解决:给定一个任意长的字符串列表,在尽可能少的执行中将它们作为参数传递给程序,同时不超过程序可以采用的参数数量的系统限制。

你适合find ... -exec,但也可以修复。只需在+命令的末尾添加find即可,它的行为类似于xargs

上面使用kate $(...)(或带有反引号的等价物)的解决方案一般都不起作用(它们不支持带空格的文件名,如果文件列表很长则根本不会运行) 。 find ... +xargs都可以解决这些限制。