首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bash-Script:按文件日期按文件夹顺序重命名文件

Bash-Script:按文件日期按文件夹顺序重命名文件
EN

Unix & Linux用户
提问于 2019-01-31 08:23:58
回答 2查看 1K关注 0票数 0

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

代码语言:javascript
运行
复制
file_1.pdf
file_2.pdf

至:

代码语言:javascript
运行
复制
file_1_ONE.pdf
file_2._TWO.pdf

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

EN

回答 2

Unix & Linux用户

发布于 2019-01-31 12:19:05

在某些BSD系统上使用zsh shell和/usr/games中的number实用程序(例如,在Ubuntu上,这可以从bsdgames包中获得):

代码语言:javascript
运行
复制
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外壳的前一模式的修饰符。它使模式扩展为常规文件的文件名列表,该列表由mtime时间戳(最后一次修改的时间)以最老的文件排序。

命令number -l "$number" | tr '[:lower:]' '[:upper:]'将调用当前值为$numbernumber,并以大写形式返回与其对应的英文单词,例如ONETWOTHREE等。该命令将在文件名前加上没有文件名的后缀和下划线,并将字符串.pdf添加到末尾。

或者,为了避免tr

代码语言:javascript
运行
复制
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-specific,${variable:u}对应于bash中的${variable^^}

测试:

代码语言:javascript
运行
复制
$ 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
代码语言:javascript
运行
复制
$ 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
EN

Unix & Linux用户

发布于 2019-01-31 10:08:26

此脚本按创建时间顺序列出当前文件夹中每个文件的名称以及一个增加的计数器。更改echo行以满足您的需要:)

代码语言:javascript
运行
复制
#!/bin/bash

((counter=1))

for f in $(ls -1ct); do
    echo $f-$counter
    ((counter+=1))
done
票数 -2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/497874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档