通过添加文件时间戳中定义的月份和年份来重命名文件

通过添加文件时间戳中定义的月份和年份来重命名文件

我将下面的脚本保存在 MYFILES 目录中,以创建 x 个文件,并且它们的时间戳是随机运行多年和几个月的。

for i in {1938..2037}; do   
    ## create a file with a random month
    touch -d "${i}-$((RANDOM % 12 + 1))-01" file_$((i-1937))
    done  
output:
-rw-r--r-- Users   0 Jul  1  1938 file_1
-rw-r--r-- Users   0 Jun  1  1947 file_10
-rw-r--r-- Users   0 Oct  1  2037 file_100 

请帮助了解如何创建脚本来分析 MYFILES 目录的内容并对子目录 FILES2 中的文件进行排序,然后根据文件的时间戳重命名文件。

示例输出应该是:

rw-r--r-- Users   0 Jul  1  1938 file_JUL1938
rw-r--r-- Users   0 Jun  1  1947 file_JUN1947
rw-r--r-- Users   0 Oct  1  2037 file_OCT2037

答案1

使用 GNU date 和 stat 来收集和反转信息:

for f in *
do
  ref=$(stat -c %y "$f" | awk '{print $1}')
  mon=$(date -d "$ref" +%b)
  year=$(date -d "$ref" +%Y)
  echo mv -- "$f" "file_${mon^^}${year}"
done

这使用 bashism 将月份大写;如果不可用,请使用echo "$mon" | tr '[:lower:]' '[:upper:]'.另一种选择是使用最近的日期功能来返回月份的大写版本date +%^b

要创建示例文件:

touch -d 1938-07-01 file_1
touch -d 1947-06-01 file_10
touch -d 2037-10-01 file_100

示例输入上的脚本输出:

mv -- file_1 file_JUL1938
mv -- file_10 file_JUN1947
mv -- file_100 file_OCT2037

答案2

ls -l file_* |
awk '{system("echo mv -v -- " $9 " file_" toupper($6) $8);}'

对于真正的文件重命名,echo应该删除该单词。

解释

  1. ls -l file_* | awk- 列出所有文件并将它们发送到awk.
  2. system()- 执行外壳命令。
  3. mv -v -- " $9 " file_" toupper($6) $8-
    • mvmv-在 shell 中执行的常用命令。
    • toupper(str)- 返回字符串的副本斯特,其中所有小写字符斯特翻译为相应的大写字母。
    • $6- 月份:八月、七月、二月
    • $8- 年份:1938、1947、2037。
    • $9- 文件名:file_1、file_10、file_100。

文件

$ ls -l file_*
-rw-rw-r-- 1 user user 0 Aug  1  1938 file_1
-rw-rw-r-- 1 user user 0 Jul  1  1947 file_10
-rw-rw-r-- 1 user user 0 Feb  1  2037 file_100

输出

mv -v -- file_1 file_AUG1938
mv -v -- file_10 file_JUL1947
mv -v -- file_100 file_FEB2037

相关内容