2

假设我有以下子目录

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

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

我现在想将每个.in文件复制到一个.out文件中,即a.intoa.outb.into b.out,并且我希望它们驻留在从中复制它们的目录中。所以a.out会在目录中找到a/

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

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

whereassign filename=给 filename 每个.in文件的值。事实上,如果分配可以摆脱.in文件扩展名会更好,而不是得到a.in.out我们会得到首选a.out

感谢您的时间。

4

3 回答 3

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 循环一次获取一个文件名,进行一些替换,然后直接复制。很好很容易(但未经测试!)。

于 2011-07-07T02:25:59.423 回答
1

尝试一个 for 循环:

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

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

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

for f in $(find . -name '*.in'); do
    cp $f ${f%.in}.out;
done
于 2011-07-07T02:29:21.337 回答
0

这应该可以解决问题!

for f in `find . -type f -name "*.in"`; do cp $f `echo $f | sed 's/in$/out/g'`; done
于 2011-07-07T02:33:54.297 回答