web-dev-qa-db-ja.com

ファイルで見つかった文字列を持つファイルを削除する-Linux CLI

Linux CLI経由でファイル内の電子メールアドレスを見つけることに基づいて、誤った電子メールを削除しようとしています。

ファイルを取得できます

find . | xargs grep -l [email protected]

しかし、次のコードが機能しないため、そこからそれらを削除する方法を理解できません。

rm -f | xargs find . | xargs grep -l [email protected]

ご協力いただきありがとうございます。

44
Spechal

安全のために、通常はfindからawkなどに出力をパイプし、各行が「rm filename」であるバッチファイルを作成します

こうすることで、実際に実行する前に確認し、正規表現では実行が難しい奇妙なEdgeケースを手動で修正できます。

find . | xargs grep -l [email protected] | awk '{print "rm "$1}' > doit.sh
vi doit.sh // check for murphy and his law
source doit.sh
59
Martin Beckett

@Martin Beckettが優れた回答を投稿しました。そのガイドラインに従ってください

あなたのコマンドのソリューション:

grep -l [email protected] * | xargs rm

または

for file in $(grep -l [email protected] *); do
    rm -i $file;
    #  ^ Prompt for delete
done
63
ajreal

find-execおよび-deleteを使用できます。grepコマンドが成功した場合にのみファイルを削除します。 grep -qを使用して何も印刷しない場合は、-q-lに置き換えて、どのファイルに文字列が含まれているかを確認できます。

find . -exec grep -q '[email protected]' '{}' \; -delete
13
OneOfOne

マーティンの安全な答えにもかかわらず、スクリプトの作成などで削除したいものが確実な場合、私は this を使用しました:

$ find . | grep -l [email protected] | xargs -I {} rm -rf {}

しかし、私はむしろ名前で見つけます:

$ find . -iname *something* | xargs -I {} echo {}
2
cregox

私はMartin Beckettのソリューションが好きでしたが、スペースのあるファイル名はそれをつまずかせることがわかりました(ファイル名にスペースを使用している人、pfft:Dなど)。また、「rm」コマンドで単に削除するのではなく、一致したファイルをローカルフォルダーに移動するために、一致したものを確認したかったのです。

# Make a folder in the current directory to put the matched files
$ mkdir -p './matched-files'

# Create a script to move files that match the grep
# NOTE: Remove "-name '*.txt'" to allow all file extensions to be searched.
# NOTE: Edit the grep argument 'something' to what you want to search for.

$ find . -name '*.txt' -print0 | xargs -0 grep -al 'something' | awk -F '\n' '{ print "mv \""$0"\" ./matched-files" }' > doit.sh

Or because its possible (in Linux, idk about other OS's) to have newlines in a file name you can use this longer, untested if works better (who puts newlines in filenames? pfft :D), version:

$ find . -name '*.txt' -print0 | xargs -0 grep -alZ 'something' | awk -F '\0' '{ for (x=1; x<NF; x++) print "mv \""$x"\" ./matched-files" }' > doit.sh

# Evaluate the file following the 'source' command as a list of commands executed in the current context:
$ source doit.sh

注:utf-16エンコーディングを持つファイル内でgrepが一致しないという問題がありました。回避策については here を参照してください。 Webサイトが消えた場合、grepの-aフラグを使用して、grepでファイルをテキストとして扱い、各拡張文字の最初のバイトに一致する正規表現パターンを使用します。たとえば、エンティテと一致させるには次のようにします。

grep -a 'Entit.e'

それがうまくいかない場合は、これを試してください:

grep -a 'E.n.t.i.t.e'
2
FocusedWolf
rm -f `find . | xargs grep -li [email protected]`

より良い仕事をします。 `...`を使用してコマンドを実行し、email。@ domain.comを含むファイル名を提供します(grep -lはそれらをリストし、-iは大文字と小文字を無視します)。

1
Kastor Stein
find . | xargs grep -l [email protected]

削除方法:

rm -f 'find . | xargs grep -l [email protected]'
0
marian