首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux命令行中复制多个子目录中的文件

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

Stack Overflow用户
提问于 2011-07-07 10:10:39
回答 3查看 6.6K关注 0票数 2

假设我有以下子目录

代码语言:javascript
复制
./a/, ./b/, ./c/, ... 

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

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

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

代码语言:javascript
复制
find ./ -name '*.in'|cp * *.out

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

代码语言:javascript
复制
ls -d */ | cd; cp *.in *.out

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

这个

代码语言:javascript
复制
find ./ -name '*.in'

命令运行正常。有没有办法通过管道将参数传递给赋值操作符?例如。

代码语言:javascript
复制
find ./ -name '*.in'| assign filename=|cp filename filename.out

其中,assign filename=为filename提供每个.in文件的值。事实上,如果赋值可以去掉.in文件扩展名,那就更好了,这样我们就可以得到首选的a.out,而不是a.in.out

谢谢您抽时间见我。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-07 10:25:59

让shell帮你解决问题:

代码语言:javascript
复制
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循环一次获取一个文件名,进行一些替换,然后直接复制。很好很简单(但没有经过测试!)。

票数 4
EN

Stack Overflow用户

发布于 2011-07-07 10:29:21

尝试一个for循环:

代码语言:javascript
复制
for f in */*.in; do
    cp $f ${f%.in}.out;
done

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

或者,如果您想要递归到每个子目录(而不仅仅是一级深度),请将glob替换为find:

代码语言:javascript
复制
for f in $(find . -name '*.in'); do
    cp $f ${f%.in}.out;
done
票数 1
EN

Stack Overflow用户

发布于 2011-07-07 10:33:54

这应该能起到作用!

代码语言:javascript
复制
for f in `find . -type f -name "*.in"`; do cp $f `echo $f | sed 's/in$/out/g'`; done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6605106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档