带有自定义名称的Unix批量文件副本

时间:2014-01-06 15:27:06

标签: shell unix sh

在Unix中,我必须将批量文件从一个文件夹复制到另一个文件夹

FILE1_547804_550484_2013-12-19 21.15.32_913.pdf

FILE2_518868_616944_2014-01-03 21.10.49_718.pdf

但复制到目的地时想要删除时间部分并复制如下:

FILE1_547804_550484.pdf

FILE2_518868_616944.pdf

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:4)

dst_dir=~/tmp
f='FILE1_547804_550484_2013-12-19 21.15.32_913.pdf'
cp "$f" "$dst_dir/${f%_*-*-* *.*.*_*.pdf}.pdf"

答案 1 :(得分:1)

在您的目录下,试试这个:

ls -1|awk -F_ -v OFS='_' '{o=$0;gsub(/ /,"\\ ",o);NF-=2}$0="cp "o " "$0".pdf"'|sh

举个例子:(没有结尾|sh来显示生成的命令)

 echo 'FILE1_547804_550484_2013-12-19 21.15.32_913.pdf'|awk -F_ -v OFS='_' '{o=$0;gsub(/ /,"\\ ",o);NF-=2}$0="cp "o " "$0".pdf"'                                      
cp FILE1_547804_550484_2013-12-19\ 21.15.32_913.pdf FILE1_547804_550484.pdf

您可以根据需要添加targetDir部分。这行没有修改,将cp到你的同一目录。

答案 2 :(得分:1)

您可以使用sed或可能只是shell功能编辑文件名。以下是sed的示例:

for i in *.pdf;
do
    n=$(echo "${i}" | sed 's/^\(.\+\)\(\(_.\+\)\{2\}\)\(_.\+\)\{2\}\.pdf$/\1\2.pdf/');
    mv "${i}" "destination/${n}"
done