簡體   English   中英

Linux:批處理文件名更改添加創建日期

[英]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 datestat對輸出格式進行更簡潔的控制:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM