重命名文件以在Unix中交换扩展

时间:2017-05-10 13:56:21

标签: bash unix

我有一堆文件被" mv -backup = t source destination"复制。所以这些文件格式为*.*.~[0-9]~ 例如,

some_file_name.pdf.~1~
some_file_name.pdf.~2~
another_file_name.docx.~1~
another_file_name.docx.~2~

现在,我想重命名所有这些文件,以便备份分机号码在实际扩展名之前。像

some_file_name_1.pdf
some_file_name_2.pdf
another_file_name_1.docx
another_file_name_2.docx

有没有办法在Unix中使用shell? 任何想法将不胜感激。提前谢谢。

3 个答案:

答案 0 :(得分:1)

使用BASH正则表达式指令可以执行以下操作:

for f in *~; do
   [[ $f =~ ^(.+)\.([^.]+)\.~([0-9]+)~$ ]] &&
   echo mv "$f" "${BASH_REMATCH[1]}_${BASH_REMATCH[3]}.${BASH_REMATCH[2]}"
done

<强>输出:

mv CR_71050_5.3.17.pdf.~1~ CR_71050_5.3.17_1.pdf
mv another_file_name.docx.~1~ another_file_name_1.docx
mv another_file_name.docx.~2~ another_file_name_2.docx
mv some_file_name.pdf.~1~ some_file_name_1.pdf
mv some_file_name.pdf.~2~ some_file_name_2.pdf

一旦您满意,就可以在echo之前删除mv

答案 1 :(得分:0)

尝试:

 awk -F~ '{ split($1,splt,".");system("mv "$0" "splt[1]"_"$2"."splt[2]) }'

我们实际上是在〜上拆分文件名,然后使用awks split函数进一步拆分文本,然后将其传递给系统函数以执行mv命令。

答案 2 :(得分:0)

您可以使用重命名(它可以作为Debian软件包使用)。

$ ls
file.pdf.~1~  file.pdf.~10~  file.pdf.~2~  file.pdf.~3~  file.pdf.~9~

$ rename 's/.pdf.~([0-9]+)~$/$1.pdf/' *.pdf.~*~
$ ls
file10.pdf  file1.pdf  file2.pdf  file3.pdf  file9.pdf