Linux

通過添加文件時間戳中定義的月份和年份來重命名文件

  • September 28, 2017

我將下面的腳本保存在 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
ls -l file_* |
awk '{system("echo mv -v -- " $9 " file_" toupper($6) $8);}'

對於真正的文件重命名,這個echo詞應該被刪除。

解釋

  1. ls -l file_* | awk- 列出所有文件並將它們發送到awk.
  2. system()- 執行 shell 命令。
  3. mv -v -- " $9 " file_" toupper($6) $8-
  • mv- 在 shell 中執行的常用mv命令。
  • toupper(str)- 返回字元串str的副本,將str中的所有小寫字元轉換為對應的大寫字元。
  • $6- 月份:8 月、7 月、2 月。
  • $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

使用 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:]'. 多虧了 Steeldriver,另一種選擇是使用最近的日期功能來本地返回月份的大寫版本: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

引用自:https://unix.stackexchange.com/questions/393868