4つのファイルがあるとしましょう。
a.zip created on 28 feb 2018
b.zip created on 28 feb 2018
c.zip created on 2 mar 2018
d.zip created on 2 mar 2018
2月28日付ファイルを検索してtarしたいです。
find ./ -type f -ls | grep 'Feb 28' | tar -czf somefile3.tar --null -T -
しかし、これはうまくいきません。
答え1
GNUまたはFreeBSDfind
とGNUまたはBSDの場合tar
:
find . -type f -newermt 2018-02-28 ! -newermt 2018-03-01 -print0 |
tar -cf file.tar --null -T -
(正確なナノ秒2018-02-28T00:00:00.000000000に最後に変更されたファイルを除いて、翌日のファイルを含めることもできます。これは、ファイルが使用されていない限り、ナノ秒単位のファイルシステムではほとんど発生しませんtouch -t
。touch -d
秒未満の正確なタイムスタンプを保存しないアーカイブから作成または独自に抽出されます)
POSIXlyとファイル名に改行文字が含まれていないとします(標準のtarアーカイブ形式にもファイル名に追加の制限があります)。
touch -d 2018-02-28T00:00:00 .start
touch -d 2018-03-01T00:00:00 .end
find . -type f -newer .start ! -newer .end ! -path ./.start ! -path ./.end |
pax -x ustar -w > file.tar
GNUツールを使用して(2018年だけでなく)2月28日にすべての一般ファイルを最後に変更するには:
find . -type f -printf '%Tm-%Td-%p\0' |
sed -nz 's/^02-28-//p' |
tar -cf file.tar --null -T -
の出力はfind -ls
自動的に安定して後処理されず、人が使用できる用途にのみ作成されました。
答え2
を使用すると、star
コマンドラインは次のようになります。
touch -t201802280000 ref
star -c -f file.tar -find . -newer ref
注: -newermt はlibfind
。
終了日も気に入った場合:
touch -t201802280000 start
touch -t201802282359.59 end
star -c -f file.tar -V pat='start!end' -find . -newer start ! -newer end
1秒を省略する必要がある場合、または年がうるう年の場合は、2日間が出ることがあります。
2018年はうるう年ではないので使用できますtouch -t201803010000 end
。
答え3
あなたのコマンドがうまくいかない理由を追加したかったのです。
find ./ -type f -ls | grep 'Feb 28' | tar -czf somefile3.tar --null -T -
findの出力は、ファイル名のリストや日付などの他の情報です。 Grep は日付が一致する行全体を出力します。 Tarはファイル名のみを必要とし、改行ではなくNULLバイトで区切る必要があります。
答え4
find
持つ日付オプション。それを食べましたか?
-newermt 最終変更日
- 最後の訪問日が最新です。
-newerct権限の変更の最終日
たとえば、
find . -newermt 2018-07-10 ! -newermt 2018-7-11 | xargs tar -cfv file.tar
編集する
〜のようにチャールズ・ダフィーこの問題を回避するには、コメントしてください。
find . -newermt 2018-07-10 ! -newermt 2018-7-11 -print0 | xargs -0 tar -cfv file.tar