cas*_*cas 13
cp可以将单个文件复制到不同的文件名(即“重命名”目标),但无法为多个文件指定不同的文件名。所以答案是否定的,cp复制多个文件时不能重命名。
当cp给出两个以上的参数时,所有文件都被复制到最后一个参数(一个目录)。例如cp file1 file2 file3 /path/to/destdir/
GNUcp有一个-tor--target-directory选项,它允许您在源文件之前指定目标。例如cp -t /path/to/destdir/ file1 file2 file3
-t与例如... | xargs cp -t destdir/或一起使用时特别有用find ... -exec cp -t destdir/ {} +。
其他一些 GNU 工具,包括mv并且ln也有相同的-taka--target-directory选项。
如果要在复制多个文件时重命名它们,最简单的方法是编写脚本来完成。
您可以自动生成大部分脚本。有很多方法可以做到这一点,这里是最简单的方法之一(以文件名匹配*.txt为例):
find . -maxdepth 1 -name '*.txt' \
-exec echo cp \'{}\' \'/path/to/dest/newfile\' \; > mycp.sh
Run Code Online (Sandbox Code Playgroud)
(我在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'
Run Code Online (Sandbox Code Playgroud)
然后mycp.sh使用您喜欢的文本编辑器进行编辑,并newfile在每个cp命令行上更改为您想要将该复制文件重命名为的任何内容。如果您不想重命名某些文件,只需newfile从目标中删除,只留下路径作为目标。
注意输出的最后一行,'./foo'bar.txt'作为源文件名 - 因为文件名包含一个'字符,这一行需要一些额外的编辑来将嵌入更改'为'\'',因此该行看起来像这样:
cp './foo'\''bar.txt' '/path/to/dest/newfile'
Run Code Online (Sandbox Code Playgroud)
或者,如果您有 GNU sed(带有NUL 分隔行的-zor--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
Run Code Online (Sandbox Code Playgroud)
完成脚本编辑后,您可以使用sh mycp.sh.
不,cp不会重命名它复制的文件。它将每个文件复制到目标目录中具有相同基本名称的文件中。cp更改文件名的唯一情况是复制单个文件并指定全名而不是目录作为目标时。
某些版本的cp可以重命名已经存在的目标文件(如果有的话)。
如果要在复制文件时重命名文件,可以使用pax. 这是一个用于复制目录树或创建或解压存档的实用程序。它是 POSIX 系统上的强制性实用程序,但某些 Linux 发行版默认情况下不安装它(尽管它可以作为包提供)。使用 pax,您可以通过应用 sed 风格的指令重命名文件。s/REGEX/REPLACEMENT/
pax -rw -pe -s/2015/2016/ source/ target/
Run Code Online (Sandbox Code Playgroud)
分别将文件如source/foo-2014.txt和复制source/2015.txt到target/foo-2014.txt和target/foo-2016.txt。