如何同时重命名一个目录中的多个文件

如何同时重命名一个目录中的多个文件

我的目录/var/tmp/abc有 4 个文件:

12345-ram-3e3r5-io9490-89adu9.csv
45434-dam-qwe35-to9490-43adu9.csv
11234-cam-yy3r5-ro9490-85adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv

我想以最短的方式(可能是一行)重命名所有 CSV 文件(找到所有文件并重命名它们):

XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv

答案1

rename -n 's/(\w+)/XXXXX/' *.csv

高兴的时候去掉-n

答案2

尝试:

for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done

怎么运行的:

  • for f in *.csv; do

    这将启动所有文件的循环*.csv

  • mv -i -- "$f" "XXXXX-${f#*-}"

    这会根据需要重命名文件,并在覆盖任何文件之前以交互方式询问。

  • done

    这标志着循环的结束。

例子:

$ ls -1
11234-cam-yy3r5-ro9490-85adu9.csv
12345-ram-3e3r5-io9490-89adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
45434-dam-qwe35-to9490-43adu9.csv
$ for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
$ ls -1
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv

答案3

我假设您的所有文件都以 5 个数字字符开头,因此使用剪切命令将初始数字文件替换为“XXXXX”。

下面是命令之前的文件。

-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 11111_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 12345_baz_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml

下面是单行命令。

for src in *.csv; do dst=XXXXX$(echo $src| cut -c6-); mv $src $dst; done;

下面是命令后的文件。

-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 XXXXX_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 XXXXX_baz_file.csv

参考:

循环查看 bash 中的命令输出

bash 中的子字符串

答案4

没有叉子:

ls | perl -lne '$suf=substr($_,6); rename $_, "XXXXX-$suf"'

当您使用 shell 循环时,mv每个文件分叉一次。 Perl 的rename命令没有。

(Perl 的重命名命令有一些限制,但在这种特定情况下,这些限制不适用。)

至于rename前面显示的命令,是的,它有效,但是您会在两种不同类型的重命名之间产生混淆,等等。如果你有合适的,那就太好了,但如果没有,这也有效。

如果您没有 perl-rename 命令并且无法安装它,您可以这样做:

ls | perl -lne '$old=$_; s/(\w+)/XXXXX/; rename $old, $_'

如您所见,这使用了顶部答案中显示的相同替换。当然,perl-rename 还有其他花哨的功能(-n已经提到了最上面的答案,然后还有-0-f、等等),并且您需要的越多,您应该安装的越多,而不是以这种方式滚动您自己的。

相关内容