【问题标题】:Unix bulk file copy with custom name具有自定义名称的 Unix 批量文件复制
【发布时间】:2014-01-06 15:27:06
【问题描述】:

在 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

我怎样才能做到这一点?

【问题讨论】:

  • 让我试试下面提到的所有方法,今天晚上回来...谢谢指导!

标签: shell unix sh


【解决方案1】:
dst_dir=~/tmp
f='FILE1_547804_550484_2013-12-19 21.15.32_913.pdf'
cp "$f" "$dst_dir/${f%_*-*-* *.*.*_*.pdf}.pdf"

【讨论】:

  • 您在目标文件名末尾缺少.pdf,它应该是cp $f $dst_dir/${f%_*-*-*\ *.*.*_*.pdf}.pdf,但这是一个不错的bash 解决方案,+1。
  • 最简单。谢谢你。休息解决方案也有效,因此对所有人 +1。你能告诉我你在上面所做的这种技术叫什么吗?
【解决方案2】:

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

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 到您的同一目录。

【讨论】:

  • 感谢您的指导 +1
  • 但是 targetDir 会去哪里?
【解决方案3】:

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

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

【讨论】:

  • 感谢您的指导 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多