改变文件顺序

改变文件顺序

我有一系列按字母顺序命名的文件(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将计数格式化为两个零填充的数字
  • 反引号将输出变成字符串

我认为其余部分是不言自明的,但如果没有,请询​​问

相关内容