重命名数千个具有相似名称的文件

重命名数千个具有相似名称的文件

我正在创建一个 bash 脚本来重命名我的文件。这些文件位于同一文件夹中,并且全部看起来像这样

1xxx_(一串字符)=(一串字符)=1234567890

现在我想要的是只留下最后一个 1234567890。基本上删除从前面到第二次出现 = 的每个字符

答案1

您可以使用 shell 的参数扩展功能:特别是

${parameter#word}
${parameter##word}
       Remove matching prefix pattern.  The word is expanded to produce
       a pattern just as in pathname expansion.  If the pattern matches
       the  beginning of the value of parameter, then the result of the
       expansion is the expanded value of parameter with  the  shortest
       matching  pattern  (the ``#'' case) or the longest matching pat‐
       tern (the ``##'' case) deleted.

所以像

for file in *; do echo mv -- "$file" "${file##*=}"; done

echo如果看起来做正确的事情,请删除)。


您可能会遇到的一个问题是,一旦删除前缀,文件名可能会变得不唯一。您可以选择使用-n--no-clobber选项跳过重命名这些情况mv

for file in *; do mv --no-clobber -- "$file" "${file##*=}"; done

或使用-b--backup选项创建不同的备份:最直接

for file in *; do mv --backup=numbered -- "$file" "${file##*=}"; done

这将添加区分后缀.~1~.~2~等等。

答案2

Perl 重命名脚本(在 debian/ubuntu 中是标准的,或者在此处提供:http://tips.webdesign10.com/files/rename.pl.txt)将根据正则表达式重命名文件。它将-n只打印指定的文件而不实际重命名它们,允许您在执行操作之前进行测试:

# Check before renaming...
$ rename -n 's/^.*=//' *
1xxx_DSAFDSAFDSFA=FDAFDSAFDSAFSDA=12341243142 renamed as 12341243142

# now rename all files
$ rename 's/^.*=//' *

它是非常灵活的工具,因为它可以轻松地基于通配符(例如*所有文件或*.txt所有文本文件)对文件进行操作,并且它接受任何 perl 正则表达式。

答案3

awk也可以拯救这里。我正在使用那里,如果你愿意的话cp将其更改为:mv

ls | awk -F"=" '{system("cp -i "$0" "$3)}'

为了安全起见,我也会使用它-i作为参数。cp

相关内容