特定の日付のファイルフィルタリング

特定の日付のファイルフィルタリング

私のオペレーティングシステムはSolaris 10(64ビット)で、ログディレクトリにはたくさんのファイルがあり、毎日40〜50個のログを受け取ります。このディレクトリには、過去20日間のファイルがあり、ファイルの日付が追加された名前の特定のディレクトリに毎日ファイルを移動したいと思います。

例えば

File_name  date
1.txt      31-jul-20122 
2.txt      01-Aug-2012

次に、2012年7月31日の古いファイルのディレクトリを作成し、新しいディレクトリ31-jul RIO_31-Jul-2012に移動し、8月1日のファイルと同じように移動します。

現在の日付でうまく機能するスクリプトを書いていますが、以前の日付に合わせて変更する方法がわかりません。

私のスクリプトは次のとおりです

NEWDIR=RIO_31-Jul-2012
mkdir /ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/$NEWDIR
cd /var/opt/ers/logs/rio
touch -t `date +%Y%m%d0000` dummy
find . -newer dummy -type f  |
while read fname
do
    mv $fname /ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/$NEWDIR
done

ベストアンサー1

Solarisではls -E

ログディレクトリ内のすべてのファイルを繰り返します。各ファイルの日付をインポートし、必要に応じてターゲットディレクトリを作成し、ファイルを移動します。

for f in /var/opt/ers/logs/rio/*; do
  ymd=$(ls -Eog "$f" | awk '{print $4}')
  target=/ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/RIO_$ymd
  mkdir -p "$target"
  mv "$f" "$target"
done

アーカイブディレクトリの名前はと同じ形式になりますRIO_2012-07-31RIO_31-Jul-2012時系列でソートされるため、YMD形式をお勧めします。短縮された月名とDMY順序が本当に必要な場合は、代わりに使用してls -eそれls -Eに応じてawk呼び出しを変更してください。

  mdy=$(ls -eog "$f" | awk '{print $5 "-" $4 "-" $7}')

サブディレクトリでファイルを繰り返し検索する必要がある場合は、findすべてのファイルを繰り返してから、各ファイルを再実行するシェルフラグメントを呼び出します。

find /var/opt/ers/logs/rio -type f -exec sh -c '
  ymd=$(ls -Eog "$0" | awk "{print \$4}")
  target=/ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/RIO_$ymd
  mkdir -p "$target"
  mv "$0" "$target"
' {} \;

beforeを使用すると、beforeを追加してより古いファイルのみを一致させるfindことができます。少なくとも42日前に変更された一致ファイルのみを追加できます。! -newer somefile-execsomefile-mtime 42

おすすめ記事