我有许多长度不同但扩展名相同的文件,并且我尝试了许多命令来一次重命名所有文件。
是否可以仅更改所有文件名的最后 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