lsをgrepにパイプし、grepでフィルタリングされたファイルを削除するにはどうすればよいですか?


33

ホームファイルのパッケージを削除したかったのですが、ファイル名が長すぎました(google-chrome-stable_current_i386.deb)。そこで、コマンドを使用しls|grep chrome|rmてファイルをgrepにパイプし、chromeファイルを除外してから削除することにしました。それはうまくいきませんでしたので、私はこれをどのように行うことができるかを見たいです。


22
rm -i *chrome*.deb
ランバート

28
一般的に言って、人々が「それをしないでください」という回答を投稿するのは嫌いですが、これは私が今まで見たXY問題の最良の例の1つです。あなたの本当の問題は、「どのように私はすぐに全部を入力せずに、長いファイル名を持つファイルを削除してください」、との出力をgrepを含まない良い方法がたくさんあるあるls
マイケルMrozek

5
find-を使用しますfind . -name "*chrome*" -delete
スパイダーボリス


3
StackExchangeユーザーとしての私の2セント:将来、あなたが試したことの詳細を提供しながら、より一般的な方法で質問をしてください。「ファイル名に特定の文字列が含まれるフォルダ内のファイルを削除するにはどうすればよいですか?」それを表現するより良い方法かもしれない。それから、余計なことに、パイピングlsを試みたが、それを機能させることができなかったことを追加するgrepことrmができます。そうすれば、非効率的な解決策について誰かに強制的に答えさせるのではなく、タスクを達成するための「正しい」または「最も簡単な」方法について1つまたは2つの良い答えが得られます。
エイドリアン

回答:


56

これは私をほとんど夢中にさせました。

  1. あなたはあなたの足でそのショットガンを指すのをやめたいかもしれません。基本的にパースの任意の種類は、lsより多くのことを行っている複雑でエラーが発生しやすい設立などの方法よりfind [...] -execグロブ
  2. 誰かがトロールディストリビューションをインストールしていない限り、シェルはTab完了しています。入力してrm googleを押すだけTabです。すぐに完了しない場合は、Tabもう一度押すと、一致するファイルのリストが表示されます。ファイル名の文字をさらに入力して、完了するまで絞り込み、コマンドを実行します。
  3. パイプ!= パラメータ。標準入力は、コマンドに非同期的に供給することができるバイナリデータストリームです。パラメーターはスペースで区切られた文字列で、コマンドの実行時に1回だけコマンドに渡されます。これらはほとんど交換できません。

1
n00bの質問のように思えたら申し訳ありません。記載されているパッケージは「クロム」が記載されている唯一のパッケージであるため、一般的に使用しても大丈夫だと思いました。したがって、grepを使用すると、1つのファイルのみが除外されます。私はLinuxにかなり慣れていないので、すでに多くのbashスクリプトを作成しましたが、まだすべてがわかりません:P。厳しい、男。
SpecialBomb

5
過酷なことを意味していませんでしたが、シェルは、ユーザーフレンドリーな表面の後ろに隠れた、過酷で容赦ない環境です。物事を安全に行うことは十分に困難であり、安全に、または正しくさえ気にしないでください。
l0b0

2
@SpecialBombこれが唯一の正しい答えです。他の答えがそうであるように、ショットガンを正しく狙い撃ちする方法を説明することは、確かに進むべき道ではありません。盲目的に実行することに特に注意してくださいrm-これはおそらくあなたのディストリビューションを揚げるための単一のより一般的な方法です。
スパイダーボリス

@BoristheSpiderへー、私は間違いなくすでにUbuntuを2回AMDのグラフィックスカードドライバーをインストールして揚げました。しかし、私はすでにそれについて質問をしました。AMDは恐ろしいので、AMDカードでLinuxを使用したゲームの一般的な修正またはより良い方法があるかどうかを尋ねました。
SpecialBomb

34

ワイルドカードを使用してfindコマンドを使用することもできます。

find . -maxdepth 1 -name '*chrome*' -delete

「-maxdepth」引数は、findが現在のディレクトリでのみ機能し、サブディレクトリに再帰しないことを保証することに注意してください。


1
改善の提案:(a)-iname大文字と小文字を区別しないファイル名の使用(b)flag for およびflag forのxargs使用へのパイプ。を使用すると、「インタラクティブ」(削除の確認?)削除などを実行できます。-print0find-0xargsxargsfoo
クリストファーシュルツ

3
-execオプションを使用する場合、xargsにパイプする必要はありません。find . -name '*chrome*' -exec rm -i {} +
Johnny

4
これもサブディレクトリに再帰的に削除しませんか?maxdepth1になるように指定する必要がある場合があります。
Tyzoid15年

32

あなたは正しい考えを持っていた、ただいくつかの詳細を見逃した。STDINに来るリストを処理していて、rmパラメーターを予期しているため、を使用する必要がありますxargs

したがって:

ls | grep chrome | xargs rm

あなたが欲しいものを与える必要があります。

chromeファイル以外をすべて削除する場合は-vgrepステートメントに追加するだけでよいことに注意してください。

この質問に対する他の回答ごとに、これはおそらくあなたが達成したいことを達成するための悪い方法であることに注意してください。


で、これ-vは一致するファイル以外のすべて削除しませんchromeか?私はOPが望んでいるものだとは思いません...
akivajgordon

もう一度見て、あなたは正しいです。OPは「クロムファイルを除外」したいが、それを削除したい。
ジョン

単純な「rm -i chrome」と比較すると、これは不必要に複雑に思えます
チャンダー

5
受け入れられた回答は機能しますが、それが悪い考えである理由を説明する以下の回答を参照してください。(ここにこ​​のコメントを投稿するのは、「承認済み」チェックマークが表示されたらすぐに停止する人のためだけです。)
ジムデイビス

1
これは、出力に「奇妙な」ファイル名がない場合にのみ、受け入れられる回答が「機能する」ls。スペースを含むファイル名はこれを破壊します。これは、誰かがこれを実行するディレクトリに特別なソースを持つファイル名を作成できる場合にも危険です。複数の人がすでに指摘しているので、lsの出力を解析しないください
スティーブンP

11

lsの出力を解析しないでくださいls [ 1 ]の出力を解析
すること避けることをお勧めします。コマンドと組み合わせた場合はさらにそうです。これは多くの理由で、主にファイル名に許可されている予期しない、通常ではない文字に関連しています。 del

Linuxパッケージに属するファイル名が「うまく動作すると期待する必要がある場合でも、同じディレクトリに他のファイルが存在するが、知らなかったり気づかなかったりすると、この問題が発生する可能性があります。

これは、より有効に活用するのですfind、タブ拡張(名前とプレスを書き始めるTab)、ファイル名の拡張 [ 2 ]のように*MyKey*...


高速なソリューション
あなたはすべてのパッケージ(その仕上げを選択したいので、.debと)「グーグル」ワイルドカードであなたの要求を構築することができます内側に* *google*.deb、簡単な操作を行います

rm -i *google*.deb 

中央に「google」が付いた各ファイル名が選択され、現在のディレクトリで終了します。このオプション(インタラクティブ)は確認を求めます。これは、パラメーターを展開してファイルを削除する際の良い習慣です。.deb-i


あなたの試みの哲学に近い解決策
あなたの目的がコマンドラインピースを次々と構築することである場合、あなたが行ったlsls | grep google、そしてあなたが出力チェックした後にのみ、あなたはサブシェル$(...)でそれを実行することができます

rm -i $(ls | grep google)

より速く、より危険な方法 [ 3 ]を使用することです!!

ls | grep google
rm -i $(!!)

それはあなたの履歴で終了した最後のコマンドを実行します。でシェルオプションhistverifyを事前に有効にした場合、実行する行を視覚的に制御できないという事実から身を守ることができますshopt -s histverify


5
touch 0 1 2 3 4 5 6 7 8 9
find . -name \[0-9] -ok rm {} \;

< rm ... ./0 > ? y
< rm ... ./9 > ? y
< rm ... ./8 > ? y
< rm ... ./7 > ? y
< rm ... ./6 > ? y
< rm ... ./5 > ? y
< rm ... ./4 > ? y
< rm ... ./3 > ? y
< rm ... ./2 > ? y
< rm ... ./1 > ? y
^C

... -name '*c*.deb'代わりに、使用するか他のパターンを使用します。


2

rmからの入力を受け付けませんstdin。あなたは次のようなことをする必要がありますls google-chrome* | xargs rm

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.