Bash

重命名多個文件,中間加日期

  • January 25, 2019

我想重命名文件夾中的所有文件,包括名稱中的目前時間戳,保留原始副檔名,在 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 是替換這兩個字元還是直接使用該字元串

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