删除 mac os 上多个文件的部分名称

Remove part of name of multiple files on mac os

我有一个充满 .png 文件的目录,文件名中间有一个随机字符,例如

T1_021_É}ÉcÉjÉV_solid box.png
T1_091_ÉRÉjÉtÉ@Å[_City.png
T1_086_ÉnÉiÉ~ÉYÉL_holiday.png

删除后我希望如此

T1_021_solid box.png
T1_091_City.png
T1_086_holiday.png

谢谢

如果随机字符集前后有_

find . -type f -iname "T1_0*" 2>/dev/null | while read file; do 
    mv "${file}" "$(echo ${file} | cut -d'_' -f1,2,4-)"
done 

解释:

  • 查找所有以 T1_ 开头的文件
  • 使用 while 循环逐行读取列表
  • 使用 _ 作为分隔符并剪切第 3 列
  • 使用 mv 重命名

重命名后的文件名:

T1_021_solid box.png
T1_086_holiday.png
T1_091_City.png

使用for收集文件列表和bash参数扩展并删除子字符串,您可以在包含文件的目录中执行以下操作:

for i in T1_*; do 
    beg="${i%_*_*}"             ## trim from back to 2nd '_'
    end="${i##*_}"              ## trim from from through last '_'
    mv "$i" "${beg}_$end"       ## mv file to new name.
done

(注意: 你不必使用变量 begend 你可以将两个参数扩展组合起来形成新的文件名,例如 mv "$i" "${i%_*_*}_${i##*_}",由您决定,但是 begend 使事情更具可读性。)

结果

新文件名:

$ ls -al T1_*
T1_021_solid
T1_086_holiday.png
T1_091_City.png

只是从 bash 开始的另一种方法。

使用cut

您可以使用 cut 删除第三个字段,使用 '_' 作为定界符:

for i in T1_*; do
    mv "$i" $(cut -d'_' -f-2,4- <<< "$i")
done

(相同的输出)

唯一的缺点是在命令替换中使用 cut 每次迭代都需要生成一个额外的子 shell。