批量重命名文件名,包括空格和模式

批量重命名文件名,包括空格和模式

我想重命名一堆以一般形式命名的文件,

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.doejames.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

sed修改文件的内容。使用rename反而。

$ find . -name "*.ext" -print0 | xargs -0 rename 's/\[firstname\.lastname\]//g'

传递rename旗帜-n以使其进行预演。这样,您就可以测试您的命令,而无需实际重命名任何文件。

我还对代码进行了一些其他更改。

  • 添加-print0tofind-0toxargs允许命令处理空格。默认情况下,find使用换行符分隔其输出的文件名,并xargs期望接收由空格分隔的文件名。-print0并使-0这两个命令将空字节视为文件名分隔符。看这个问题了解更多信息。

  • rename用途Perl正则表达式,它特别对待.[, 和]。在这种情况下,他们必须逃脱。

相关内容