我有一个目录,里面全是 foo_num.txt 文件。我想将所有文件重命名为 num.txt(即删除“foo_”部分)。我可以用一行代码完成这个操作吗?
答案1
如果你不想在 Bash 中使用 for 循环,你可能想要使用rename
程序:
rename "s/foo_//" *.txt
第一个参数是定义字符串替换规则的 Perl 表达式。在本例中:[s]ubstitute "foo_" with ""。
第二个参数过滤您想要重命名的文件。
答案2
由于你的第一部分被一个_
我建议你
rename 's/.*?_//' *.txt
办法?
不贪婪,因此只有第一次出现的_
会被替换。
例子
$ ls -laog
total 4280
drwxrwxr-x 2 4329472 Aug 10 13:05 .
drwx------ 55 20480 Aug 10 12:54 ..
-rw-rw-r-- 1 0 Aug 10 13:05 foo_1_1.txt
-rw-rw-r-- 1 0 Aug 10 13:05 foo_2_2.txt
-rw-rw-r-- 1 0 Aug 10 13:05 foo_3_3.txt
$ rename 's/.*?_//' *.txt
$ ls -laog
total 4280
drwxrwxr-x 2 4329472 Aug 10 13:06 .
drwx------ 55 20480 Aug 10 12:54 ..
-rw-rw-r-- 1 0 Aug 10 13:05 1_1.txt
-rw-rw-r-- 1 0 Aug 10 13:05 2_2.txt
-rw-rw-r-- 1 0 Aug 10 13:05 3_3.txt
要替换所有出现的情况,请使用
rename 's/.*_//' *.txt
例子
$ ls -laog
total 4280
drwxrwxr-x 2 4329472 Aug 10 13:08 .
drwx------ 55 20480 Aug 10 12:54 ..
-rw-rw-r-- 1 0 Aug 10 13:08 foo_1_1.txt
-rw-rw-r-- 1 0 Aug 10 13:08 foo_2_2.txt
-rw-rw-r-- 1 0 Aug 10 13:08 foo_3_3.txt
$ rename 's/.*_//' *.txt
$ ls -laog
total 4280
drwxrwxr-x 2 4329472 Aug 10 13:09 .
drwx------ 55 20480 Aug 10 12:54 ..
-rw-rw-r-- 1 0 Aug 10 13:08 1.txt
-rw-rw-r-- 1 0 Aug 10 13:08 2.txt
-rw-rw-r-- 1 0 Aug 10 13:08 3.txt