我想知道是否有一种方法可以在不编写脚本的情况下复制和重命名一堆文件。我有一些名称类似于的文件prefix_12345678901_12345678901_suffix.ext
,我需要将它们全部复制到给定目录中,以便副本的名称类似于1234567890_1234567890.ext
我也不想覆盖目标目录中的现有文件。
我知道我可以做这样的事情:
cp -n source/*.ext target
其次是
rename 's/.*([0-9]{11}_[0-9]{11}).*\.(.*$)/$1.$2/' *.ext
但这会先进行复制,然后才确定文件是否已经存在。我需要一种相反的过程......
编辑:
好吧,我想这是脚本,但我最终成功了:
for i in /source/*.ext; do if [[ "$i" =~ [0-9]{11}_[0-9]{11} ]]; then cp $i /target/${BASH_REMATCH[0]}.ext; fi done;
答案1
pax
可以一次全部复制和重命名。
pax -rw -pp -k \
-s'!^source/[^/]*\([0-9]\{11\}_[0-9]\{11\}\)[^/]*\(\.[^./]*\)!\1\2!' \
-s'!.*!!' source target
pax -rw
复制文件;-pp
保留权限,并-k
表示不覆盖现有文件。这些-s
参数告诉 pax 在复制时重命名文件。第一个转换使您想要的重命名(使用基本正则表达式和像这样的替换ed
)。第二个转换将每个尚未匹配的源文件名转换为空字符串,这告诉 pax 不要复制该文件。
zsh 粉丝请注意:据我所知,您无法zmv
复制定义不存在的文件而不管其他文件。