Linux
通過添加文件時間戳中定義的月份和年份來重命名文件
我將下面的腳本保存在 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
詞應該被刪除。解釋
ls -l file_* | awk
- 列出所有文件並將它們發送到awk
.system()
- 執行 shell 命令。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