私は現在オペレーティングシステムのコースを受講しており、このコースの一部としてbashスクリプトを書く方法を学んでいます。スクリプトを介してサブディレクトリに触れることなく、ディレクトリ内のすべてのファイルに日付を追加する必要があります。私はすべてのファイルに日付を追加する1行のスクリプトを書いてきましたが、現在のディレクトリのフォルダにも適用されます。
for f in *; do mv -- "$f" "$f-$(stat -c %Y "$f" | date +%Y%m%d)"; done
これにより、ファイル名の末尾に日付が追加されますが、前述のようにその下のディレクトリに到達します。私は現在RedHatLinuxでbashバージョン4.1.2を使用しています。
Unixの経験が少なく(私は主にWindowsユーザーです)、誰もがここにいるので混乱しています。どんな助けでもいただければ幸いです。
答え1
slmがすでに指摘したように、$f
通常のファイルをテストできます。学びながらスクリプトを一行ではないものに変更する予定ですが、読んで維持するのが難しくなる傾向があります。
for f in *
do
if [ -f "$f" ]
then
mv -- "$f" "$f-$(stat -c %Y "$f" | date +%Y%m%d)"
fi
done
(;
後で改行を挿入して削除することで縮小できます)
引数が通常のファイル(デバイスまたはディレクトリではない)かどうかをテストします-f
。他のテストもあります(たとえば、ディレクトリの場合でもテスト-d
できます)。if [ ! -d "$f" ]
答え2
これはあなたが望むことをするでしょう。
for file in $(find . -type f); do mv -- "$file" "$file-$(stat -c %Y "$file" | date +%Y%m%d)"; done
新しい部分を説明するには、findコマンドを使用してファイルのみを検索します(-f入力)。
find . -type f
。
答え3
ループはまったく必要なく、find
オプション+と一緒に使用してください。exec
sh -c
find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(stat -c %Y "$0" | date +%Y%m%d)' {} \;
しかし、パイプは私にとってあまり意味がありませんstat
。date
追加したい場合現在のstat
これにより、すべてのファイル名に日付がまったく必要なくなります。
find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(date +%Y%m%d)' {} \;
一方、時間を追加するには最後のレビュー次に、各ファイルに対して-r
次のオプションを使用しますdate
。
find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(date -r "$0" +%Y%m%d)' {} \;
必要に応じて、練習用に出力を入力stat
として使用し、date
コマンド--date
オプションを使用しますdate
。
find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(date +%Y%m%d --date=@$(stat -c %Y "$0"))' {} \;