web-dev-qa-db-ja.com

シェルスクリプト— <date>以降に変更されたすべてのファイルを取得します

私はPHPでこれをしたくないので、シェルスクリプトに詳しい人が助けてくれることを望んでいます。

ディレクトリを再帰的に実行し、最終更新日が特定の日付よりも大きいすべてのファイルを見つけるスクリプトが必要です。次に、パス情報を保持したままファイルをtarおよびZipします。

131
Peter

単純な:

find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz

find . -mtime -1は、前日に変更された(再帰的に)現在のディレクトリ内のすべてのファイルを選択します。たとえば、分数を使用できます。

find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz
132
skrat

GNU findがある場合、多数の関連オプションがあります。唯一の障害は、それらへのインターフェースが恒星以下であることです:

  • -mmin n(変更時間(分))
  • -mtime n(変更時間(日))
  • -newer file(ファイルの変更時間より新しい変更時間)
  • -daystart(現在時刻から開始時刻までの開始時刻を調整します)
  • さらに、アクセス時間と「変更」または「作成」時間の代替手段。

難しい部分は、時間からの分数を決定することです。

検討する価値のある1つのオプション:touchを使用して、必要な変更タイムスタンプを持つファイルを作成します。次に、find-newerとともに使用します。

touch -t 200901031231.43 /tmp/wotsit
find . -newer /tmp/wotsit -print
rm -f /tmp/wotsit

これにより、2009-01-03T12:31:43より新しいファイルが検索されます。明らかに、スクリプトでは、/tmp/wotsitは、一意にするためのPIDまたはその他の値を持つ名前になります。また、ユーザーが割り込んだ場合でも削除されるようにするため、trapなどがあります。

90

これはtarで直接行うことができ、さらに優れています。

tar -N '2014-02-01 18:00:00' -jcvf archive.tar.bz2 files

これは、2014年1月1日18:00:00より新しいファイルを圧縮するようにtarに指示します。

31
linux_newbie

これはいくつかのファイルに対して機能します。パスにスペースが含まれている場合に備えて、「-print0」と「xargs -0」を含めます。この例では、過去7日間に変更されたファイルを検索します。過去7日間より前に変更されたものを見つけるには、「+ 7」を使用します。

find . -mtime -7 -print0 | xargs -0 tar -cjf /foo/archive.tar.bz2

このページ が警告するように、多くの引数がある場合、xargsはtarコマンドを複数回実行する可能性があり、「-c」フラグは問題を引き起こす可能性があります。その場合、これが必要になります:

find . -mtime -7 -print0 | xargs -0 tar -rf /foo/archive.tar

Zip圧縮されたtarアーカイブをtarで更新することはできないため、2番目のステップでbzip2またはgzipする必要があります。

17
Jason Luther

これにより、過去7日間に変更されたすべてのファイルが表示されます。

find . -type f -mtime -7 -print

それをtar/Zipにパイプすると、うまくいくはずです。

12
Chris Doggett

7日前からすべての新しいファイルをバックアップするには、次のようにします。

tar --newer $(date -d'7 days ago' +"%d-%b") -zcf thisweek.tgz .

「7日前」を必要に応じて任意のものに置き換えることもできます

date -d'yesterday' +"%d-%b"になります

または:date -d'first Sunday last month' +"%d-%b"

3
Michel

よくLinuxでfindコマンドのmanページを読んでみてください

man find

このようなものは

 find . -type f -mtime -7 -print -exec cat {} \; | tar cf - | gzip -9

そしてあなたはそれを持っています

3
Luixv

X日前より後の最終変更ファイルのリストを取得するには:

find . -mtime -x

次に、結果リスト内のファイルをtarおよびZipする必要があります。例:

tar czvf mytarfile.tgz `find . -mtime -30`

先月中に変更されたすべてのファイルに対して。

3
mouviciel

このスクリプトは、指定された日付の前後2分の修正日を持つファイルを検索します(また、要件に応じて条件の値を変更できます)

PATH_SRC="/home/celvas/Documents/Imp_Task/"
PATH_DST="/home/celvas/Downloads/zeeshan/"

cd $PATH_SRC
TODAY=$(date  -d "$(date +%F)" +%s)
TODAY_TIME=$(date -d "$(date +%T)" +%s)


for f in `ls`;
do
#       echo "File -> $f"
        MOD_DATE=$(stat -c %y "$f")
        MOD_DATE=${MOD_DATE% *}
#       echo MOD_DATE: $MOD_DATE
        MOD_DATE1=$(date -d "$MOD_DATE" +%s)
#       echo MOD_DATE: $MOD_DATE

DIFF_IN_DATE=$[ $MOD_DATE1 - $TODAY ]
DIFF_IN_DATE1=$[ $MOD_DATE1 - $TODAY_TIME ]
#echo DIFF: $DIFF_IN_DATE
#echo DIFF1: $DIFF_IN_DATE1
if [[ ($DIFF_IN_DATE -ge -120) && ($DIFF_IN_DATE1 -le 120) && (DIFF_IN_DATE1 -ge -120) ]]
then
echo File lies in Next Hour = $f
echo MOD_DATE: $MOD_DATE

#mv $PATH_SRC/$f  $PATH_DST/$f
fi
done

たとえば、特定の日付よりも前の修正日を持つファイルが必要な場合は、120パラメーターの条件を破棄して、0パラメーターで$DIFF_IN_DATE$DIFF_IN_DATE1に変更できます。

同様に、指定された日付の1時間前後の変更日付を持つファイルが必要な場合は、1203600if CONDITIONに置き換えるだけです。

2
Zeeshan Ali