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

假设我有以下子目录

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

也就是说,在我目前的工作目录下是这些子目录的a/b/c/ ,而在这些子目录中都是文件。 在目录中, a/是文件a.in ,在目录b/是文件b.in等等。

我现在要将每个.in文件复制到一个.out文件,即a.ina.outb.inb.out ,并且我希望它们驻留在它们被复制的目录中。 所以a.out将在目录a/find。

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

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

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

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

但它会列出子目录,进入其中每一个,但不会让cp做它的工作(这仍然是行不通的)

 find ./ -name '*.in' 

命令工作正常。 有没有办法pipe道参数赋值运算符? 例如

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

其中assign filename=赋予文件的每个.in文件的值。 实际上,如果赋值可以摆脱.in文件扩展名,那么会更好一些,而不是得到a.in.out我们会得到首选的a.out

感谢您的时间。

让壳帮助你:

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

我只是采取了你说的工作的查找命令,让bash读取一次输出一个文件名。 所以bash while循环一次获得一个文件名,做一个替换,并且直接复制。 很好,很容易(但没有测试!)。

尝试for循环:

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

glob应该捕获所有具有.in扩展名的下一个目录的文件。 在cp命令中,除去.in后缀,然后附加一个.out(请参阅使用字符串运算符在Bash中进行变量处理 )

另外,如果你想递归到每个子目录(不只是1级深),用一个find替换glob:

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

这应该做的伎俩!

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