我的目录/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
参考:
答案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
、等等),并且您需要的越多,您应该安装的越多,而不是以这种方式滚动您自己的。