更改多个文件的基址(而非扩展名)的最后 10 个字符

更改多个文件的基址(而非扩展名)的最后 10 个字符

我有许多长度不同但扩展名相同的文件,并且我尝试了许多命令来一次重命名所有文件。

是否可以仅更改所有文件名的最后 10 个字符?最后 10 个字符始终相同。

例如 :

img(12345678).txt
test(12345678).txt 
download(12345678).txt
upload(12345678).txt

我想替换(12345678)abcdefghij

答案1

有两个 Linux 命令rename在发行版中常用。我更喜欢基于 perl 的重命名,因为它更强大。您可以检查一下您使用的是哪一个$ prename --version

如果您有基于 perl 的重命名,

$ rename --version
perl-rename 1.9
$ rename 's/\(12345678\)/abcdefghij/' *.txt

如果您想先通过试运行来检查它,请使用该-n标志。

如果您有其他重命名,

$ rename --version
rename from util-linux 2.26.2
$ rename '(12345678)' abcdefghij *.txt

.txt通常删除前面的最后 10 个字符

如果字符不总是相同,则可以在一般情况下使用它。

对于基于 Perl 的重命名,

rename 's/.{10}\.txt\Z/abcdefghij.txt/' *.txt -n

对于其他重命名,我不确定是否可能。

答案2

尝试这个。如果对建议的操作感到满意,请删除echo并重新运行。

$ ls
download(12345678).txt  img(12345678).txt  upload(12345678).txt
$ for F in *; do echo mv "$F" "${F/(12345678)/abcdefghij}"; done
mv download(12345678).txt downloadabcdefghij.txt
mv img(12345678).txt imgabcdefghij.txt
mv upload(12345678).txt uploadabcdefghij.txt
$

答案3

您只需在bash//dash中执行此操作zsh,无需恢复到可能未安装的实用程序。在bash

for x in *"(12345678).txt"; do mv "$x" "${x%(12345678).txt}"abcdefghij.txt; done

用于$x%pattern删除匹配就足够了。From man bash:

   ${parameter%word}
   ${parameter%%word}
          Remove matching suffix pattern.  The word is expanded to produce
          a pattern just as in pathname expansion.  If the pattern matches
          a  trailing portion of the expanded 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 pattern (the ``%%'' case) deleted.  If parameter  is  @
          or  *,  the  pattern  removal operation is applied to each posi‐
          tional parameter in turn, and the  expansion  is  the  resultant
          list.   If  parameter is an array variable subscripted with @ or
          *, the pattern removal operation is applied to  each  member  of
          the array in turn, and the expansion is the resultant list.

答案4

尝试

 ls |  awk '{printf "mv %s %s\n",$0,gsub("(12345678)","abcedfgh" );}' | bash

相关内容