2017-04-30 19 views
0

私はファイルを含む多くのサブディレクトリを持つディレクトリを持っています。 各WAVファイルについて、ファイルの先頭にファイルのタイムスタンプを変更せずに、作成日(ファイルWAVが最初に作成された日付)を追加して、WAVファイルの名前を変更したいと考えています。Linux:バッチファイル名の変更で作成日が追加される

次のステップは、WAVファイルをMP3ファイルに変換することで、ハードドライブのスペースを節約します。

私はbashスクリプトを作成しようとしていますが、いくつか問題があります。

私は元のディレクトリと同じ構造を維持したいので、私のようなものを考えていた。ちょうど(シェルがそれらをグロブせ、ファイル名のリストを生成するためにlsを使用しないでください

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 
+1

「最後のデータアクセスの時刻、最後のデータ変更の時刻、およびファイルステータスが最後に変更された時刻」のみがあります。どちらが必要ですか? * .wavファイルのための – RomanPerekhrest

+1

は、あなたがbackticksとlsを必要としません。 – codeforester

+0

'man stat'と他の' stat'ドキュメントを再読み込みします。すべての 'awk .. 'がなくても、あなたが望む日付文字列を生成できるはずです。 sed .. 'もの。がんばろう。 – shellter

答えて

0

それは)ls *.wavはとにかく何をするかです:

for file in ./*.wav ; do 

私はあなたが形式YYYYMMDD_HHMMSSにタイムスタンプをしたいと思いますか? あなたは、出力形式のややすっきり制御持っているstatとGNU dateを使用することができます。

epochtime=$(stat -c %Y "$file") 
name=$(date -d "@$epochtime" +%Y%m%d_%H%M%S).wav 

stat -c %Y(または%y)の最終更新日時を与えるが、あなたは本当にファイルの作成日時を取得することはできませんLinuxシステムではcptimestampcpの終わりに浮遊cpを除いて、OKに見えますが、それはタイプミスでなければならないこと

*.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を使用する必要があります。また、元のファイル名をそのまま残しておきたいのかどうかは分かりませんが、ファイル名を削除してファイル名をタイムスタンプに置き換えます。

関連する問題