我有一系列按字母顺序命名的文件(xaa.tif 到 xdg.tif)。我需要反转文件名的顺序,以便在脚本中首先处理最后一个文件。我想通过在文件名开头添加一个数字来重命名它们(01xdg.tif 到 60xaa.tif)。
我如何使用 Linux 上的 bash 脚本来实现这一点?
答案1
因为文件名不包含特殊字符,包括空格,这可以通过使用ls -r
(即-r
,--reverse
而不是-R
)轻松实现--recursive
。
/tmp/todo$ ls
/tmp/todo$ touch ab bc bd ef
/tmp/todo$ ls
ab bc bd ef
/tmp/todo$ ls -r
ef bd bc ab
/tmp/todo$
然后你可以使用以下命令重命名文件:
num=1
for file in $(ls -r)
do
mv $file "$(seq --format='%02g' $num $num)${file}"
num=$(( $num + 1 ))
done
这用于seq
格式化数字,使用两位数字 ( 2
) 从左侧补零 ( %0
),无小数位 ( g
),总格式字符串为%02g
。可能有更有效的方法来实现这一点,但由于文件太少,我不会费心进行微优化。
这只是遍历文件列表(以相反的顺序),依次重命名每个文件,并为每个重命名增加一个计数器。
最终结果是:
/tmp/todo$ ls
01ef 02bd 03bc 04ab
/tmp/todo$
请注意,如果文件名中包含比简单的 az、句点和数字更不寻常的内容,上述方法很可能会失败。特别是,我不确定它能否很好地处理空格。
答案2
您可以使用 Linux 中的 sort 命令
假设目录包含以下文件
# ll /tmp/sort_folder
total 0
-rw-r--r-- 1 root root 0 Dec 18 19:51 a
-rw-r--r-- 1 root root 0 Dec 18 19:51 b
-rw-r--r-- 1 root root 0 Dec 18 19:51 v
排序命令将给出如下输出(默认按升序)
# ll /tmp/sort_folder | sort
-rw-r--r-- 1 root root 0 Dec 18 19:51 a
-rw-r--r-- 1 root root 0 Dec 18 19:51 b
-rw-r--r-- 1 root root 0 Dec 18 19:51 v
要反向排序(降序),您可以使用 -r(反向)选项进行排序命令
# ll /tmp/sort_folder | sort -r
total 0
-rw-r--r-- 1 root root 0 Dec 18 19:51 v
-rw-r--r-- 1 root root 0 Dec 18 19:51 b
-rw-r--r-- 1 root root 0 Dec 18 19:51 a
答案3
这应该有效:
#!/bin/bash
#
Count=0
ls -r | while read FileName
do
FmtCount=`printf %02d $Count`
mv -i $FileName $FmtCount$FileName
Count=$((Count+1))
done
解释如下:
ls -r
以相反的顺序列出文件printf
将计数格式化为两个零填充的数字- 反引号将输出变成字符串
我认为其余部分是不言自明的,但如果没有,请询问