我想复制并重命名一个目录中的多个c 源文件。
我可以这样复制:
$ cp *.c $OTHERDIR
但我想给所有文件名加上前缀:
file.c --> old#file.c
我怎样才能一步完成此操作?
答案1
一个for
循环:
for f in *.c; do cp -- "$f" "$OTHERDIR/old#$f"; done
我经常添加-v
选项以cp
允许我观察进度。
答案2
您可以使用 shell 通配符:
for f in *.c; do cp -- "$f" "$OTHERDIR/old#$f"; done
该for variable in GLOB
格式将扩展全局到所有匹配的文件/目录(不包括隐藏的)并迭代它们,依次将每个文件/目录保存为$variable
(在上面的示例中,$f
)。因此,我显示的命令将迭代所有非隐藏文件,复制它们并添加前缀。
答案3
xargs
这是一个使用,tr
和 globbing 的单行代码。可能有一定的价值。
echo *.c | tr ' ' '\n' | xargs -n1 -I{} cp "{}" "PREFIX{}"
这将返回所有匹配的文件*.c
作为空格分隔的字符串。接下来,tr
将多余的空格转换为换行符 (注意没有测试带空格的文件名**)。然后,xargs
填充每个文件名,并cp
使用适当的名称和前缀运行。
*.c
可以修改为其他有用的 glob。xargs
和部分中的其他前缀cp
也可以使用。
**对于文件名中带有空格的文件:
(需要find
支持-print0
)与上面类似,我们可以用来find
输出无效的- 分隔的文件列表,并xargs
使用标志进行调整以分隔无效的
find . -name '*.c' -print0 | xargs -0 -n1 -I{} cp "{}" "PREFIX{}"
答案4
如果需要的话,这是一种递归的方法,
for f in `find . -name \*.c`; do name="${f//\.\//__}"; fileName="${name//\//_}" ; echo "Copying $f as $OTHERDIR/old#$fileName"; cp -- "$f" "$OTHERDIR/$fileName"; done