Bash
重命名多個文件,中間加日期
我想重命名文件夾中的所有文件,包括名稱中的目前時間戳,保留原始副檔名,在 Solaris 中,如下所示:
test1.txt > test1.date.txt
我試過這個,但我失去了名字的第一部分:
find * -prune -type f -name '*.txt' -exec mv {} {}.$(date +'%Y%m%d%H%M').txt \;
我錯過了什麼?
find . -type f -name '*.txt' -exec sh -c ' now=$( date +%Y%m%d%H%M ) for pathname do mv "$pathname" "${pathname%.txt}.$now.txt" done' sh {} +
這將在目前目錄中或目前目錄下找到所有正常文件的路徑名,其名稱以
.txt
. 對於這些批次,呼叫一個簡短的 shell 腳本。該腳本將首先獲取時間戳(為了提高效率,每個批次只有一次),然後遍歷給定的路徑名。對於每個路徑名,它將通過刪除最終路徑名
.txt
(使用${pathname%.txt}
)並添加一個點、時間戳和.txt
.這尚未在 Solaris 上進行測試,但僅使用標準組件和選項等。
要僅計算一次時間戳,請在呼叫之前
find
使用now=$( date +%Y%m%d%H%M ) \ find ...as before (but without assigning to now)...
或者
env now="$( date +%Y%m%d%H%M )" \ find ...as before (but without assigning to now)...
(注意上面兩個命令中的續行)
如果文件位於單個目錄中,只需執行循環:
now=$( date +%Y%m%d%H%M ) for pathname in ./*.txt; do mv "$pathname" "${pathname%.txt}.$now.txt" done
這假定該模式
./*.txt
匹配您要重命名的所有名稱。有關的:
你的
{}.$(date +'%Y%m%d%H%M').txt
工作不便攜。它可能與 的某些實現一起使用,但如果與另一個字元串一起出現,find
則不需要將實現擴展{}
到目前路徑名。{}
來自POSIX 標準的相關文本是:
utility_name
僅包含兩個字元的或參數{}
應替換為目前路徑名。如果一個utility_name
或參數字元串包含這兩個字元{}
,但不只是這兩個字元{}
,則由實現定義 find 是替換這兩個字元還是直接使用該字元串。