我想按文件日期的顺序重命名文件;来自示例:
file_1.pdf
file_2.pdf
到:
file_1_ONE.pdf
file_2._TWO.pdf
该脚本必须将第一个文件重命名为按文件日期排序的“ONE”。
答案1
使用某些 BSD 系统上的zsh
shell 和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)
特定于zsh
shell 的前面模式的修饰符。它使模式扩展为常规文件的文件名列表,该列表按 mtime 时间戳(上次修改时间)排序,最旧的文件在前。
该命令number -l "$number" | tr '[:lower:]' '[:upper:]'
将number
使用当前值进行调用$number
,并以大写形式返回与此相对应的英文单词,例如ONE
,,TWO
等THREE
。这将在文件名前面加上下划线,不带文件名后缀,并且字符串.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
)转换为大写。修饰符:u
是zsh
-特定的并且${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