アーカイブ内の変更タイムスタンプが抽出されたコピーに保存されないようにファイルを抽出した場合(しかし、抽出されたファイルには通常の変更時間があります)、これを攻撃する正しい方法は変更時間です。抽出されたすべてのファイルには、そのディレクトリ内で最後に変更された既存のファイルよりも新しい変更タイムスタンプがあります。
これは簡単な状況です。
少なくとも24時間、現在のディレクトリにある既存のファイルがどれも操作されていないとします。したがって、過去24時間以内に変更されたものはすべて、zipファイルからジャンクされます。
$ find . -mtime -1 -print0 | xargs -0 rm
これはいくつかのディレクトリも見つけますが、rm
それらはそのままにしておきます。これらは2番目のパスで対処できます。
$ find . -mtime 1 -type d -print 0 | xargs -0 rmdir
最近変更されたディレクトリはすべて、zipによって変更されました。rmdir
それらが正常に削除された場合、それは空であることを意味します。zipで変更された空のディレクトリは、おそらくそれによって作成されました。つまり、アーカイブから取得されたものです。100%確信することはできません。解凍ジョブが空の既存のディレクトリにいくつかのファイルを置く可能性があります。
find
ツリーのファイルがあまりにも最近変更されたため、ジョブの24時間の細分性が十分ではない場合、次に簡単なことを検討します。unzipジョブが既存のサブディレクトリに何も入れなかったとします。つまり、解凍されたものはすべて、最上位のファイルか、以前は存在しなかった新しいサブディレクトリのいずれかであり、したがって、zipからの素材のみが含まれています。次に:
# list directory in descending order of modification time
$ ls -1t > filelist # descending order of modification time
ここfilelist
で、テキストエディタで開き、zipから来ていないリストの最初のエントリを決定します。そのエントリとその後のすべてを削除します。残っているのは、zipから取得したファイルとディレクトリです。最初に、名前のスペースやエスケープする必要がある引用符の出現などの問題を視覚的に検査します。その後、必要に応じて、すべてを引用符で囲むことができます。以下では、Vimを使用することを想定しています。
:%s/.*/"&"/
次に、すべてを1つの大きな行に結合します。
:%j
次にrm -rf
、その前に挿入します。
Irm - rf<ESC>
シェルコマンドとしてカーソルの下の行を実行します。
!!sh<Enter>
確かに、すでに存在していたファイルを消去したり、ファイル名の問題のために台無しにしたりするリスクがあるため、このタスクのステップを自動化しません。
zip内のパスのリストを取得する明白なルートをたどり、それをファイルにキャプチャし、非常に慎重に調べて、必要な編集を行った後に削除に変換します。
lq
オプションについては知りませんでしたが、unzizp
彼の主な答えに古典的な* nixのトリックをいくつか追加しました。