【发布时间】:2009-09-30 19:33:03
【问题描述】:
我有很多文件,它们的名称中有一个共享模式,我想删除它们。例如,我有文件“a_file000.tga”和“another_file000.tga”。我想对那些会从名称中删除模式“000”的文件进行操作,从而产生新名称“a_file.tga”和“another_file.tga”。
【问题讨论】:
标签: bash
我有很多文件,它们的名称中有一个共享模式,我想删除它们。例如,我有文件“a_file000.tga”和“another_file000.tga”。我想对那些会从名称中删除模式“000”的文件进行操作,从而产生新名称“a_file.tga”和“another_file.tga”。
【问题讨论】:
标签: bash
Bash 可以做类似sed 的替换:
for file in *; do mv "${file}" "${file/000/}"; done
【讨论】:
${parameter/pattern/string}。更详细的参数替换示例可以在 Advanced Bash-Scripting Guide 的第 10.2 节 Parameter Substitution 中找到。
试试这个(这也适用于普通的老 Bourne sh):
for i in *000.tga
do
mv "$i" "`echo $i | sed 's/000//'`"
done
两个参数都用引号括起来以支持文件名中的空格。
【讨论】:
一个非 bash 解决方案,因为我知道两个快速的海报已经涵盖了这一点:
有一个非常棒的简短 perl 程序,称为 rename,它默认安装在某些系统上(其他系统的重命名程序不太有用)。它允许您使用 perl 正则表达式进行重命名,例如:
rename 's/000//' *000*.tga
【讨论】:
#!/bin/bash
ls | while read name; do
echo mv $name ${name/$1//}
done
【讨论】:
find。
while read 是一种改进(如果使用正确,使用空的IFS 和-r,以及-d '' 和NUL 分隔的输入流),但ls 是相反。见Why you shouldn't parse the output of ls