我有多个文件,其名称如下所示
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]*\)
) 进行查找。我们正在捕获AUG
in\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
您可能有不同的年份或月份。如果是这种情况,您必须提取要保留的名称的其他部分才能构建新名称。