如何通过删除每个文件名中不同但位于同一位置的中间 4 个字符来重命名多个文件?

如何通过删除每个文件名中不同但位于同一位置的中间 4 个字符来重命名多个文件?

我想使用 Bash 重命名我的文件,删除中间的 4 个字符。

原始文件名:

dwe_hiul123456.pdf
dwe_lkyd345876.pdf
dwe_ythn157843.pdf

我想删除中间的 4 个字母,这样新文件名将是:

dwe_123456.pdf
dwe_345876.pdf
dwe_157843.pdf

4 个字母始终跟在 后面,并且文件名中_始终有 1 个字母。_所有文件名的长度都相同,我要删除的四个字符位于同一位置。

我对此真的很陌生,除了使用 Windows 10 之外,我不知道我正在使用什么版本。我试图通过 Git Bash 命令窗口来执行此操作。

答案1

rename如果您有 perl-rename (在基于 Debian 的系统或其他系统上可用perl-rename),您可以执行以下操作:

$ rename -n 's/_..../_/' *pdf
dwe_hiul123456.pdf -> dwe_123456.pdf
dwe_lkyd345876.pdf -> dwe_345876.pdf
dwe_ythn157843.pdf -> dwe_157843.pdf

导致仅打印它将执行的操作而不进行任何更改-nrename一旦您确认它按您想要的方式工作,请删除-n并再次运行命令以实际重命名文件:

rename 's/_..../_/' *pdf

如果由于某种原因无法使用rename,也可以使用简单的 shell 循环来完成:

for file in *pdf; do
    echo mv -- "$file" "${file/_????/_}"
done

再次,如果您确信这能达到您想要的效果,请删除 来echo实际重命名命令:

for file in *pdf; do
    mv -- "$file" "${file/_????/_}"
done

答案2

使用参数扩展

$ for i in *.pdf; do
    echo mv -- "$i" "${i/_[a-z][a-z][a-z][a-z]/_}"
    #  actual `mv` command
    # mv -- "$i" "${i/_[a-z][a-z][a-z][a-z]/_}"
  done
mv -- dwe_hiul123456.pdf dwe_123456.pdf
mv -- dwe_lkyd345876.pdf dwe_345876.pdf
mv -- dwe_ythn157843.pdf dwe_157843.pdf

如果您对结果满意echo,请将其删除以实际执行命令。

相关内容