删除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 你可以组合两个参数扩展来形成新的文件名,例如 {{1} },由您决定,但 mv "$i" "${i%_*_*}_${i##*_}"beg 使内容更具可读性。)

结果

新文件名:

end

仅从 bash 处理它的另一种方法。

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

您可以使用 cut 删除第三个字段,使用 cut 作为分隔符:

'_'

(相同的输出)

唯一的缺点是在命令替换中使用 for i in T1_*; do mv "$i" $(cut -d'_' -f-2,4- <<< "$i") done 需要每次迭代生成一个额外的子 shell。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...