使用cp命令复制多个文件时,复制时可以重命名文件吗?

使用cp命令复制多个文件时,复制时可以重命名文件吗?

我想知道这是真的还是假的。

答案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 工具,包括mvln也有相同的-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-dataxargs

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.txttarget/foo-2014.txttarget/foo-2016.txt

相关内容