**对于文件名中带有空格的文件:

**对于文件名中带有空格的文件:

我想复制并重命名一个目录中的多个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

相关内容