2011-10-01 9 views
5

すでに何かが入っているディレクトリに何かを解凍しました。代わりに別のディレクトリに解凍したかったのです。今すぐに区別するファイルが多すぎます。しかし、私が解凍したファイルは今作成されています(右?)、元のファイルは長い間(少なくとも1日)修正されていません。作成された情報に基づいてこれらのuntarファイルのみを削除する方法はありますか?linuxのディレクトリに最近作成されたすべてのファイルを削除するには?

答えて

6

Tarは通常、ファイルのタイムスタンプを復元するため、時間によるフィルタリングは機能しません。

それでもtarファイルを持っている場合は、あなたがのようなものでアンパック何を削除するためにそれを使用することができます:

tar tf file.tar --quoting-style=shell-always |xargs rm -i 

上記のほとんどのケースでは動作しますが、キャリッジリターンを持っていないすべての(ファイル名彼らはそれを壊すだろう)ので、注意してください。

-rを追加することでディレクトリを削除できますが、トップレベルのディレクトリを手動で削除するほうが安全です。

+2

ファイル名のスペースを使って動作させるのは本当に簡単です。それははるかに良い答えになります。 – Omnifarious

+0

@omnifaこの作業をスペースで行うにはどうすればいいですか?抽出されたディレクトリを削除するには、rmの後に-Rも含めますか? – AnkurVj

+0

@AnkurVj:残念なことに、実際には、タールにはヌル文字で区切られたファイル名のリストを作成する方法はありませんが、これはかなり残念です。そして、そうです、 'rm'の後ろに' -r'があるはずです。 Matは答えを更新していないので、私は自分で入れます。 – Omnifarious

3

find。 -mtime -1 -type f | xargs rm

ただし、最初に

でテストしてください。 -mtime -1 -type f | xargs echo

+2

これは2つのこと以外は良いでしょう。まず、**常に** -print0'と 'xargs -0'を使います。ファイル名にランダムな空白文字を入れないようにしてください。第二に、 'tar'はタイムスタンプを復元するので、ここでmtimeを実際に使うことはできません。おそらく、あなたのファイルシステムがそれを更新するように設定されている場合は、おそらくatimeです。 – Omnifarious

+0

また、注意してください。最後の10分間に変更されたファイルに対して-mmin -10を検索する – sehe

1

複雑さが増す順にこの質問にいくつかの回答があります。

まず、これがオフで、この特定のインスタンスでは、ファイル名に奇妙な文字がないことを絶対に確信しています(スペースはOKですが、タブ、改行またはその他の制御文字、これは動作します:

tar -tf file.tar | egrep '^(\./)?[^/]+(/)?$' | egrep -v '^\./$' | tr '\n' '\0' | xargs -0 rm -r 

すべては、サブディレクトリのすべてのサブディレクトリをスキップすることです。

ファンキーなファイル名で動作するこれを行うための別の方法はこれです:あなたのアーカイブが展開されたディレクトリを作成しますが、あなたはすでにとにかくすることを望んでいたように聞こえるだろう

mkdir foodir 
cd foodir 
tar -xf ../file.tar 
for file in *; do rm -rf ../"$file"; done 

。また、名前が.で始まるファイルは処理されません。

.で始まるファイルとそのメソッドの作業を行うには、次の操作を行います。

mkdir foodir 
cd foodir 
tar -xf ../file.tar 
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 sh -c 'for file in "[email protected]"; do rm -rf ../"$file"; done' junk 

最後に、Mat's answerから取って、あなたはこれを行うことができますし、それはどんなファイル名では動作しないuntarしなければならなくなります再びディレクトリ:

tar -tf file.tar | egrep '^(\./)?[^/]+(/)?$' | grep -v '^\./$' | tr '\n' '\0' | xargs -0 bash -c 'for fname in "[email protected]"; do fname="$(echo -ne "$fname")"; echo -n "$fname"; echo -ne "\0"; done' junk | xargs -0 rm -r 
0

あなたがして1回のパスでファイルやディレクトリを処理することができます

tar -tf ../test/bob.tar --quoting-style=shell-always | sed -e "s/^\(.*\/\)'$/rmdir \1'/; t; s/^\(.*\)$/rm \1/;" | sort | bash 

あなたはより多くの処理を必要と改行を含むファイル名を処理するために「bashの」

tar -tf ../test/bob.tar --quoting-style=shell-always | sed -e "s/^\(.*\/\)'$/rmdir \1'/; t; s/^\(.*\)$/rm \1/;" | sort 

へのパイプをオフのままに起こるために何が起こっているか見ることができます。

関連する問題