web-dev-qa-db-ja.com

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

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

34
SpecialBomb

これはほとんど私を困らせました。

  1. その ショットガン を足元に向けないようにしてください。基本的に、lsのあらゆる種類の解析は、 _find [...] -exec_ または globs のような確立されたメソッドよりも 複雑でエラーが発生しやすい になります_。
  2. 誰かがあなたのためにトロルディストリビューションをインストールしない限り、あなたのシェルは Tab 完了。 _rm google_と入力して押します Tab。すぐに完了しない場合は、 Tab もう一度、一致するファイルのリストを表示します。ファイル名の文字をさらに入力して、完了するまで絞り込み、コマンドを実行します。
  3. パイプ != パラメータ 。標準入力はバイナリデータストリームであり、非同期でコマンドに送ることができます。パラメータはスペースで区切られた文字列で、コマンドの実行時に一度だけ渡されます。これらは非常にまれに交換可能です。
57
l0b0

あなたは正しい考えを持っていました、ちょうどいくつかの詳細を見逃しました。あなたはSTDINに来るリストを扱っており、rmはパラメータを期待しているので、xargsを使用する必要があります。

したがって:

ls | grep chrome | xargs rm

あなたが望むものを与えるべきです。

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

この質問に対する他の回答によれば、これはおそらく、達成したいことを達成するための悪い方法です。

35
John

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

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

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

34
chander

lsの出力を解析しない
私の提案は、lsの出力を解析しないようにすることです [ 1 ]delコマンドと組み合わせて使用​​するとさらに多くのことができます。これは主に、ファイル名に許可されている通常ではない予期しない文字に関連する多くの理由によります。

Linuxパッケージに属するファイル名が「正常に動作する」と予想する必要がある場合でも、他のファイルが同じディレクトリに存在するのに知らない場合、この問題が発生する可能性があります。または通知。

タブ拡張であるfindを使用することをお勧めします(名前を書き始めて、 Tab)、ファイル名展開 [ 2 ] _*MyKey*_として...


高速なソリューション
"google"を含むすべてのパッケージ(_.deb_で終わる)を選択したいので、ワイルドカード_*_ _*google*.deb_そして単純な

_rm -i *google*.deb 
_

現在のディレクトリに存在する_.deb_で終わる "google"が途中にある各filenameを選択します。オプション_-i_(対話型)は、確認を求めるプロンプトを表示します。これは、パラメーター展開を使用してファイルを削除するときに適切な習慣です。


あなたの試みの哲学に近い解決策
コマンドラインを1つずつ作成することが目的である場合、ls、_ls | grep google_の後、およびをチェックした後にのみ、 outputサブシェル$(...)で実行できます

_rm -i $(ls | grep google)
_

より速く、より危険な方法 []、_!!_を使用します

_ls | grep google
rm -i $(!!)
_

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

12
Hastur
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'または代わりにあなたに合った他のパターン。

5
mikeserv

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

2
David King