我正在创建一个 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