
私のオペレーティングシステムは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-31
。RIO_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
-exec
somefile
-mtime 42
答え2
ctime または atime でファイルを検索し、リストされたファイルを正しいディレクトリに移動できます。
find . -iname "*.txt" -ctime -<daysago> -type f
「日前」は整数です。