[英]Linux: batch filename change adding creation date
我有一個包含很多子目錄的目錄,包括文件。 對於每個 WAV 文件,我想通過在文件開頭添加創建日期(首次創建文件 WAV 的日期)來重命名 WAV 文件(不更改文件本身的時間戳)。
下一步是將 WAV 文件轉換為 MP3 文件,這樣我將節省硬盤空間。
為此,我正在嘗試創建一個 bash 腳本,但我遇到了一些問題。
我想保持與原始目錄相同的結構,因此我在考慮類似的事情:
for file in `ls -1 *.wav`
do name=`stat -c %y $file | awk -F"." '{ print $1 }' | sed -e "s/\-//g" -e "s/\://g" -e "s/[ ]/_/g"`.wav
cp -r --preserve=timestampcp $dir_original/$file $dir_converted/$name
done
不要使用ls
生成文件名列表,只需讓 shell glob 它們(無論如何ls *.wav
這樣做的):
for file in ./*.wav ; do
我想你想要格式為YYYYMMDD_HHMMSS
的時間戳? 您可以使用 GNU date
和stat
對輸出格式進行更簡潔的控制:
epochtime=$(stat -c %Y "$file" )
name=$(date -d "@$epochtime" +%Y%m%d_%H%M%S).wav
stat -c %Y
(或%y
)給出最后修改日期,但您無法真正獲得 Linux 系統上文件創建的日期。
那個cp
看起來不錯,除了timestampcp
末尾的雜散cp
,但這一定是一個錯字。 如果你做*.wav
,文件名無論如何都會相對於當前目錄,所以不需要前綴$dir_original/
。
如果您想遍歷整個子目錄,請使用 Bash 的globstar
功能,或find
. 像這樣的東西:
shopt -s globstar
cd "$sourcedir"
for file in ./**/*.wav ; do
epochtime=$(stat -c %Y "$file" )
name=$(date -d "@$epochtime" +%Y%m%d_%H%M%S).wav
dir=$(dirname "$file")
mkdir -p "$target/$dir"
cp -r --preserve=timestamp "$file" "$target/$dir/$name"
done
這里稍微有點不便,就是cp
無法創建路徑中的目錄,所以我們需要在那里使用mkdir
。 另外,我不確定您是否想保留原始文件名作為結果文件的一部分,這將刪除它並只用時間戳替換文件名。
我對name
的計算做了一些實驗,看看我是否可以更簡潔地得到它,並想出了這個:
name=$(date "+%Y%m%d_%H%M%S" -r "$file")
我想將該文件夾中的所有文件名附加到它們的創建日期,下面完美地工作。
#############################
#!/bin/sh
for file in `ls *.JPG`;
do
mv -f "$file" "$(date -r "$file" +"%Y%m%d_%H_%M_%S")_"$file".jpg"
done
##############################
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.