我想知道这是真的还是假的。
答案1
cp
可以将单个文件复制到不同的文件名(即“重命名”目标),但无法为多个文件指定不同的文件名。所以答案是否定的,cp
复制多个文件时不能重命名。
当cp
给出两个以上参数时,所有文件都将复制到最后一个参数(目录)。例如cp file1 file2 file3 /path/to/destdir/
GNUcp
有一个-t
或--target-directory
选项,允许您在源文件之前指定目标。例如cp -t /path/to/destdir/ file1 file2 file3
-t
... | xargs cp -t destdir/
当与例如或 一起使用时特别有用find ... -exec cp -t destdir/ {} +
。
其他一些 GNU 工具,包括mv
和ln
也有相同的-t
又名--target-directory
选项。
如果您想在复制多个文件时重命名它们,最简单的方法是编写脚本来完成此操作。
您可以自动生成大部分脚本。有很多方法可以做到这一点,这是最简单的方法之一(以文件名匹配*.txt
为例):
find . -maxdepth 1 -name '*.txt' \
-exec echo cp \'{}\' \'/path/to/dest/newfile\' \; > mycp.sh
(我已将file
命令分成两行,以避免出现水平滚动条,但这可以在一行上全部输入)
这将产生如下输出:
$ ls -1 *.txt
dict.txt
qstat.txt
x.txt
foo'bar.txt
$ find . . -maxdepth 1 -name '*.txt' \
-exec echo cp \'{}\' \'/path/to/dest/newfile\' \;
cp './qstat.txt' '/path/to/dest/newfile'
cp './x.txt' '/path/to/dest/newfile'
cp './dict.txt' '/path/to/dest/newfile'
cp './foo'bar.txt' '/path/to/dest/newfile'
然后mycp.sh
使用您喜欢的文本编辑器进行编辑,并newfile
在每个cp
命令行上更改为您想要将复制的文件重命名为的任何名称。如果您不想重命名某些文件,只需newfile
从目标位置删除,仅保留路径作为目标位置。
请注意输出的最后一行,作为'./foo'bar.txt'
源文件名 - 因为文件名包含一个'
字符,所以该行需要一些额外的编辑来将嵌入更改'
为'\''
,以便该行如下所示:
cp './foo'\''bar.txt' '/path/to/dest/newfile'
或者,如果您有 GNU sed
(带有NUL 分隔行的-z
或选项),您可以使用以下命令自动执行此操作:--null-data
xargs
find . -maxdepth 1 -name '*.txt' -print0 |
sed -z -e "s/'/'\\\''/g" |
xargs -0 -r -i echo cp \'{}\' \'/path/to/dest/newfile\' > mycp.sh
完成脚本编辑后,您可以使用 运行它sh mycp.sh
。
答案2
不,cp
不会重命名它复制的文件。它将每个文件复制到目标目录中具有相同基本名称的文件。更改文件名的唯一情况cp
是复制单个文件并指定全名而不是目录作为目标时。
某些版本cp
可以重命名已经存在的目标文件(如果有)。
如果您想在复制文件时重命名文件,可以使用pax
。这是一个用于复制目录树或创建或解压存档的实用程序。它是 POSIX 系统上的必备实用程序,但某些 Linux 发行版默认情况下不安装它(尽管它可以作为软件包提供)。使用 pax,您可以通过应用 sed 风格的指令来重命名文件。s/REGEX/REPLACEMENT/
pax -rw -pe -s/2015/2016/ source/ target/
source/foo-2014.txt
分别将和等文件复制source/2015.txt
到target/foo-2014.txt
和target/foo-2016.txt
。