我想重命名一堆以一般形式命名的文件,
text1 text2 [firstname.lastname] text3 ... textn.ext
我想[firstname.lastname]
从文件名中删除文本。为了简化任务,假设[firstname.lastname]
是所有文件的固定名字和姓氏。
我使用 Ubuntu 12.04,我尝试了以下命令,
$ find . -name "*.ext" -print | xargs sed -i 's/[firstname.lastname]//g'
但它不起作用。
答案1
使用 Bash 通配符:
for i in *.ext; do
echo mv -nv -- "$i" "${i/firstname.lastname/}"
done
如果您满意,请删除回声。
如果您需要进入子目录:
shopt -s globstar
for i in **/*.ext; do
echo mv -nv -- "$i" "${i/firstname.lastname/}"
done
echo
当您满意时将其删除。
使用find
:
find . -name '*.ext' -exec bash -c 'echo mv -nv -- "$0" "${0/firstname.lastname/}"' {} \;
echo
当您满意时将其删除。
怎么样一个方法可以重命名,删除任何形式的模式xxx.yyy
(因此它将删除firstname.lastname
文件名的john.doe
或james.brown
):为此(使用第一种方法):
shopt -s extglob
for i in *.ext; do
echo mv -nv -- "$i" "${i/+([[:graph:]])\.+([[:graph]])/}"
done
或使用第二种方法:
shopt -s globstar extglob
for i in **/*.ext; do
echo mv -nv -- "$i" "${i/+([[:graph:]])\.+([[:graph:]])/}"
done
或使用以下find
方法:
find . -name '*.ext' -exec bash -c 'shopt -s extglob; echo mv -nv -- "$0" "${0/+([[:graph:]])\.+([[:graph:]])/}"' {} \;
如果firstname.lastname
模式始终包含在空格之间,您还可以使用模式替换:
"${i/*([[:space:]])+([[:graph:]])\.+([[:graph:]])*([[:space:]])/ }"
以便只留一个空间。
笔记。对于带有空格和其他有趣符号的文件名,所有这些方法都是 100% 安全的。
答案2
$ find . -name "*.ext" -print0 | xargs -0 rename 's/\[firstname\.lastname\]//g'
传递rename
旗帜-n
以使其进行预演。这样,您就可以测试您的命令,而无需实际重命名任何文件。
我还对代码进行了一些其他更改。