以前の検索結果を含むUnix Tarコマンド

以前の検索結果を含むUnix Tarコマンド

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 -ttouch -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

関連情報