在unix中重命名多个文件

在unix中重命名多个文件

我有多个文件,其名称如下所示

2313_ABCDEAUG2014_PQRST_0_.pdf
3244_ABCDEAUG2014_PQRST_0_.pdf
4234_ABCDEAUG2014_PQRST_0_.pdf

不想按以下格式重命名该文件。

AZ-2014-08-2313.pdf
AZ-2014-08-3244.pdf

请建议。

答案1

有一个我认为很酷的软件,perl-rename您可以在其中简单地完成任务:

perl-rename 's/^(.*)_.*AUG2014.*/AZ-2014-08-$1.pdf/' *.pdf

HTH,干杯,

答案2

如果文件名不包含单引号或换行符:

ls | sed -n "s/$/:JAN1FEB2MAR3APR4MAY5JUN6JUL7AUG8SEP9OCT10NOV11DEC12/
  s/\(\(.*\)_.*\(...\)\([0-9]\{4\}\)_.*\):.*\3\([0-9]*\).*/mv -i -- '\1' 'AZ-\4-\5-\2.pdf'/p"

添加| sh实际进行重命名。

这是使用常见的sed技巧来进行一些翻译(此处AUG-> 8)。

我们将映射表(此处JAN1FEB2...)附加到模式空间的末尾,并依靠反向引用 ( \(...\).*\1\([0-9]*\)) 进行查找。我们正在捕获AUGin\3和 getting ( 按照映射表中\5紧随其后的数字序列。\3

答案3

下面将遍历所有 pdf 文件,并将它们复制为新的名称格式,保留原始文件,以便您可以检查它是否符合您的要求。

for file in $(ls *AUG2014*pdf) ; do newName=$(echo $file | awk -F_ '{ print $1 }') ; cp $file AZ-2014-08-$newName.pdf ; done

ls *AUG2014*pdf- 列出包含 Aug2014 的所有文件,以 pdf 结尾

for aString in <list> ; do someCommand $aString ; done- 循环遍历列表中的所有元素,每个元素都作为 aString 引用。在引用 aString 之前使用美元符号 $ 。

awk -F_- 根据“_”分隔符将字符串分成标记。上面的命令打印第一个标记。

请注意不要有多个以相同编号开头的文件。如果存在,两个文件可能会被复制到相同的文件名,一个文件会覆盖另一个文件。检查旧文件的数量与新文件的数量。

答案4

filelist='2313_ABCDEAUG2014_PQRST_0_.pdf 3244_ABCDEAUG2014_PQRST_0_.pdf 4234_ABCDEAUG2014_PQRST_0_.pdf'
for i in $filelist; do 
  id=$(echo $i|awk -F_ '{print $1}');
  mv $i AZ-2014-08-$newname.pdf;
done

您可能有不同的年份或月份。如果是这种情况,您必须提取要保留的名称的其他部分才能构建新名称。

相关内容