Linuxで先月修正されたファイルを見つける方法は?

Linuxで先月修正されたファイルを見つける方法は?

あるディレクトリで先月に変更されたファイルを検索して別のディレクトリにコピーする必要があります。

/usr/bin/find $SOURCE_DIR -maxdepth 1 -type f -name 'files*.pdf' -mtime -31 -exec cp -p {} $DEST_DIR`date +"%B_%Y"` \;

先月に変更されたファイルが必要です。例:1月、2月に変更されたファイル...提案がありますか?

答え1

@SmileDeveloperは正しい方向に向かっていますが、非常にトリッキーであることが判明しました。

$ cd "$(mktemp --directory)"
$ touch --date="$(date --date="$(date --rfc-3339=date | cut --characters=-7)-01 - 1 day" --rfc-3339=second)" last-day-of-last-month
$ touch --date="$(date --date="$(date --rfc-3339=date | cut --characters=-7)-01 - 1 second" --rfc-3339=second)" end-of-last-month
$ touch --date="$(date --rfc-3339=date | cut --characters=-7)-01" start-of-current-month
$ touch --date="$(date --date="$(date --rfc-3339=date | cut --characters=-7)-01 + 1 month - 1 second" --rfc-3339=second)" end-of-current-month
$ touch --date="$(date --date="$(date --rfc-3339=date | cut --characters=-7)-01 + 1 month" --rfc-3339=second)" start-of-next-month
$ stat --printf '%y\t%n\n' ./* | sort --key=1
2020-06-30 00:00:00.000000000 +1200 ./last-day-of-last-month
2020-06-30 23:59:59.000000000 +1200 ./end-of-last-month
2020-07-01 00:00:00.000000000 +1200 ./start-of-current-month
2020-07-31 23:59:59.000000000 +1200 ./end-of-current-month
2020-08-01 00:00:00.000000000 +1200 ./start-of-next-month
$ find . -mindepth 1 -newermt "$(date --rfc-3339=date | cut --characters=-7)-01 - 1 second" -not -newermt "$(date --rfc-3339=date | cut --characters=-7)-01 + 1 month - 1 second"
./end-of-current-month
./start-of-current-month

デフォルトでは、lastコマンドは前月の最後の秒(除外)から今月の最後の秒(含む)までの範囲を提供します。findほとんどのプログラミング言語とは異なり、包括的な開始日時と排他的な終了日時を選択する方法がないようです。

時間帯について心配する必要はないことを願っています!

答え2

今月(最初の日から始まる)

/usr/bin/find $SOURCE_DIR -maxdepth 1 -type f -name 'files*.pdf' -newermt "$(date +%y-%m-1)" -exec cp -p {} $DEST_DIR`date +"%B_%Y"` \;

先月1日から現在まで

/usr/bin/find $SOURCE_DIR -maxdepth 1 -type f -name 'files*.pdf' -newermt "$(date -d "$(date +%y-%m-1) - 1 month" +%y-%m-%d)" -exec cp -p {} $DEST_DIR`date +"%B_%Y"` \;

先月1日から先月末まで:

/usr/bin/find $SOURCE_DIR -maxdepth 1 -type f -name 'files*.pdf' -newermt "$(date -d "$(date +%y-%m-1) - 1 month" +%y-%m-%d)" -not -newermt "$(date +%y-%m-1)" \;

編集する:

で変更されたファイル検索は、その日付の開始時刻には開始されないため、mtime使用しないでください。mtime24*n

答え3

find -printfあれこれたくさん使っていると思います。

$ which month_files
month_files () {
        find . -type f -printf "%TY-%Tm\t%p\n" | grep ^$1 | cut -f2
}

# example run on my ~/.cache directory
$ month_files 2020-05 | wc
   1007    1007   49917

これで、このファイルを使用して必要なすべての操作を実行できます。例えば、

mkdir /target/2020-05
month_files 2020-05 | xargs -d"\n" -I % cp % /target/2020-05/

強制(1行に1回実行)コマンドに関して、次の方法を使用して効率を向上させることができます-I-L 1cp

month_files 2020-05 | xargs -d"\n" cp --target-directory /target/2020-05/

ファイル名に改行文字がないとします。私は私のシステムでこのような言葉にならない音を実際にはサポートしていません。スペースと一部の特殊文字は1つで、改行は別のものです。 (またはIan Flemingに謝罪しながら、「スペースは偶然、特殊文字は偶然です。改行文字敵の行動だ!)

関連情報