在Linux命令行中复制多个子目录中的文件

时间:2011-07-07 02:10:39

标签: linux cp

假设我有以下子目录

./a/, ./b/, ./c/, ... 

也就是说,在我当前的工作目录中是这些子目录a/b/c/,并且在每个子目录中都是文件。目录a/中的文件为a.in,目录b/中的文件为b.in,依此类推。

我现在想要将每个.in文件复制到.out文件,即a.ina.outb.inb.out ,我希望它们驻留在从中复制的目录中。因此,a.out将在目录a/中找到。

我尝试了各种不同的方法,例如

find ./ -name '*.in'|cp * *.out

这不起作用,因为它认为*.out是一个目录。也尝试了

ls -d */ | cd; cp *.in *.out

但它会列出子目录,进入每个子目录,但不会让cp做它的工作(仍然不起作用)

find ./ -name '*.in'

命令工作正常。有没有办法将参数传递给赋值运算符? E.g。

find ./ -name '*.in'| assign filename=|cp filename filename.out

其中assign filename=为filename提供每个.in文件的值。事实上,如果作业可以摆脱.in文件扩展名,那么会更好,而不是获得a.in.out我们会获得首选的a.out

感谢您的时间。

3 个答案:

答案 0 :(得分:4)

让shell帮助你:

find . -name '*.in' | while read old; do
    new=${old%.in}.out # strips the .in and adds .out
    cp "$old" "$new"
done

我刚接受你说的工作的find命令,让bash一次读取它的输出一个文件名。所以bash while循环一次获取一个文件名,做一点替换,然后直接复制。很好,很容易(但未经过测试!)。

答案 1 :(得分:1)

尝试for循环:

for f in */*.in; do
    cp $f ${f%.in}.out;
done

glob应该捕获一个具有.in扩展名的目录下的所有文件。在cp命令中,它剥去.in后缀,然后附加.out(参见Variable Mangling in Bash with String Operators

或者,如果你想要递归到每个子目录(不只是1级深),用find代替glob:

for f in $(find . -name '*.in'); do
    cp $f ${f%.in}.out;
done

答案 2 :(得分:0)

这应该可以解决问题!

for f in `find . -type f -name "*.in"`; do cp $f `echo $f | sed 's/in$/out/g'`; done