删除 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
(注意: 你不必使用变量 beg
和 end
你可以将两个参数扩展组合起来形成新的文件名,例如 mv "$i" "${i%_*_*}_${i##*_}"
,由您决定,但是 beg
和 end
使事情更具可读性。)
结果
新文件名:
$ 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。
我有一个充满 .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
你可以将两个参数扩展组合起来形成新的文件名,例如 mv "$i" "${i%_*_*}_${i##*_}"
,由您决定,但是 beg
和 end
使事情更具可读性。)
结果
新文件名:
$ 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。