Bash 脚本:按文件日期顺序重命名文件夹中的文件

Bash 脚本:按文件日期顺序重命名文件夹中的文件

我想按文件日期的顺序重命名文件;来自示例:

file_1.pdf
file_2.pdf

到:

file_1_ONE.pdf
file_2._TWO.pdf

该脚本必须将第一个文件重命名为按文件日期排序的“ONE”。

答案1

使用某些 BSD 系统上的zshshell 和number实用程序/usr/games(例如 Ubuntu 系统,可以从软件包中获取bsdgames):

number=1
for file in ./file_*.pdf(.Om); do
    mv "$file" "${file%.pdf}_$(number -l "$number" | tr '[:lower:]' '[:upper:]').pdf"
    number=$(( number + 1 ))
done

(.Om)特定于zshshell 的前面模式的修饰符。它使模式扩展为常规文件的文件名列表,该列表按 mtime 时间戳(上次修改时间)排序,最旧的文件在前。

该命令number -l "$number" | tr '[:lower:]' '[:upper:]'number使用当前值进行调用$number,并以大写形式返回与此相对应的英文单词,例如ONE,,TWOTHREE。这将在文件名前面加上下划线,不带文件名后缀,并且字符串.pdf将被添加到结束。

或者,避免tr

number=1
for file in ./file_*.pdf(.Om); do
    en_number=$(number -l "$number")
    mv "$file" "${file%.pdf}_${en_number:u}.pdf"
    number=$(( number + 1 ))
done

${en_number:u}会将$en_number( 的输出number)转换为大写。修饰符:uzsh-特定的并且${variable:u}对应于${variable^^}in bash

测试:

$ for name in file_{1..10}.pdf; do touch "$name"; sleep 2; done
$ ls -lt
total 4
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_10.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_9.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_8.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_7.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_6.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_5.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_4.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_3.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_2.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_1.pdf
-rw-r--r--  1 kk  wheel  163 Jan 31 13:26 script.sh
$ zsh script.sh
$ ls -lt
total 4
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_10_TEN.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_9_NINE.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_8_EIGHT.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_7_SEVEN.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_6_SIX.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_5_FIVE.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_4_FOUR.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_3_THREE.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_2_TWO.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_1_ONE.pdf
-rw-r--r--  1 kk  wheel  163 Jan 31 13:26 script.sh

答案2

该脚本按照创建时间的顺序列出当前文件夹中每个文件的名称以及递增的计数器。更改echo线路以执行您需要的操作:)

#!/bin/bash

((counter=1))

for f in $(ls -1ct); do
    echo $f-$counter
    ((counter+=1))
done

相关内容