如何在第一个字符/下划线后删除文件名并重命名

时间:2019-05-13 22:17:36

标签: bash shell replace substring

我有一个目录,其文件名具有以下格式:

DAM3D002_P_DAPedit.jpg

我需要将所有文件名重命名为:

DAM3D002.jpg

我正在使用Linux / Ubuntu 18.04

这是我尝试过的bash:

for f in *.jpg; do mv "$f" "${f%_*.jpg}.jpg" ; done

我希望输出:

DAM3D002.jpg

但是我得到了:

DAM3D002_P.jpg

1 个答案:

答案 0 :(得分:2)

您可以使用

for f in *.jpg; do mv "$f" "${f%%_*.jpg}.jpg"; done

请参见10.1. Manipulating Strings

  

${string%%substring}
  从 $ string back 中删除 $ substring 的最长匹配项。

noted by l'L'l一样,如果您的* .jpg文件名可能不包含下划线,则上述解决方案将在文件名的末尾添加第二个.jpg。如果不希望如此,请使用

for f in *.jpg; do echo "${f/_*.jpg/.jpg}"; done    

Online test

files=(1.jpg 1_2.jpg 1_2_3.jpg /a/b/c/1_2_3.jpg)
for f in "${files[@]}"; do echo "${f/_*.jpg/.jpg}"; done

输出:

1.jpg
1.jpg
1.jpg
/a/b/c/1.jpg