假设我有以下子目录
./a/, ./b/, ./c/, ...
也就是说,在我当前的工作目录中是这些子目录a/
,b/
和c/
,并且在每个子目录中都是文件。目录a/
中的文件为a.in
,目录b/
中的文件为b.in
,依此类推。
我现在想要将每个.in
文件复制到.out
文件,即a.in
到a.out
和b.in
到b.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
感谢您的时间。
答案 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