bashスクリプトを介してサブディレクトリに触れることなく、ディレクトリ内のすべてのファイルに日付を追加する方法

bashスクリプトを介してサブディレクトリに触れることなく、ディレクトリ内のすべてのファイルに日付を追加する方法

私は現在オペレーティングシステムのコースを受講しており、このコースの一部として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オプション+と一緒に使用してください。execsh -c

find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(stat -c %Y "$0" | date +%Y%m%d)' {} \;

しかし、パイプは私にとってあまり意味がありませんstatdate追加したい場合現在の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"))' {} \;

関連情報