ホームファイルの一部のパッケージを削除したいのですが、ファイル名が長すぎます(google-chrome-stable_current_i386.deb
)。したがって、コマンドls|grep chrome|rm
を使用してファイルをgrepにパイプ処理し、chromeファイルを除外してから削除します。それが機能しなかったので、私がこれをどのように行うことができるかを見るために。
これはほとんど私を困らせました。
ls
のあらゆる種類の解析は、 _find [...] -exec
_ または globs のような確立されたメソッドよりも 複雑でエラーが発生しやすい になります_。rm google
_と入力して押します Tab。すぐに完了しない場合は、 Tab もう一度、一致するファイルのリストを表示します。ファイル名の文字をさらに入力して、完了するまで絞り込み、コマンドを実行します。あなたは正しい考えを持っていました、ちょうどいくつかの詳細を見逃しました。あなたはSTDINに来るリストを扱っており、rm
はパラメータを期待しているので、xargs
を使用する必要があります。
したがって:
ls | grep chrome | xargs rm
あなたが望むものを与えるべきです。
chrome
ファイル以外をすべて削除する場合は、grep
ステートメントに-v
を追加するだけでよいことに注意してください。
この質問に対する他の回答によれば、これはおそらく、達成したいことを達成するための悪い方法です。
ワイルドカードを指定してfindコマンドを使用することもできます。
find . -maxdepth 1 -name '*chrome*' -delete
「-maxdepth」引数は、findが現在のディレクトリでのみ機能し、サブディレクトリに再帰しないことを保証することに注意してください。
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
_で事前に有効にすると、実行する行を視覚的に制御できないという事実から身を守ることができます。
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'
または代わりにあなたに合った他のパターン。
rm
はstdin
からの入力を受け入れません。 ls google-chrome* | xargs rm
のようなことをする必要があります