假设我有以下子目录
./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。
我尝试过各种不同的方法,例如
find ./ -name '*.in'|cp * *.out这不起作用,因为它认为*.out是一个目录。也尝试过
ls -d */ | cd; cp *.in *.out但是它会列出子目录,进入每个子目录,但不让cp做它的工作(这仍然不起作用)
这个
find ./ -name '*.in'命令运行正常。有没有办法通过管道将参数传递给赋值操作符?例如。
find ./ -name '*.in'| assign filename=|cp filename filename.out其中,assign filename=为filename提供每个.in文件的值。事实上,如果赋值可以去掉.in文件扩展名,那就更好了,这样我们就可以得到首选的a.out,而不是a.in.out
谢谢您抽时间见我。
发布于 2011-07-07 10:25:59
让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循环一次获取一个文件名,进行一些替换,然后直接复制。很好很简单(但没有经过测试!)。
发布于 2011-07-07 10:29:21
尝试一个for循环:
for f in */*.in; do
cp $f ${f%.in}.out;
doneglob应该捕获一个目录下具有.in扩展名的所有文件。在cp命令中,它去掉.in后缀,然后附加一个.out (请参见Variable Mangling in Bash with String Operators)
或者,如果您想要递归到每个子目录(而不仅仅是一级深度),请将glob替换为find:
for f in $(find . -name '*.in'); do
cp $f ${f%.in}.out;
done发布于 2011-07-07 10:33:54
这应该能起到作用!
for f in `find . -type f -name "*.in"`; do cp $f `echo $f | sed 's/in$/out/g'`; donehttps://stackoverflow.com/questions/6605106
复制相似问题