问题描述
我有一个充满 .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
(注意:你不必使用变量 beg
和 end
你可以组合两个参数扩展来形成新的文件名,例如 {{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。