ロケートの結果をrmにパイプする


11

走ってみた

locate *.orig | xargs rm

しかしそれは言った No such file or directory

私はそれを行う方法を見てきましたfindが、locateはオブジェクトへのフルパスを返すので、それは可能であるべきです

回答:


20

ファイル名にスペースが含まれている場合は、使用する必要があります

locate -0 $something | xargs -0 rm

locateマニュアルページから:

-0--null各エントリを別々の行に書き込むのではなく、ASCII NUL文字を使用して出力のエントリを区切ります。このオプションは、GNU xargs(1)の--nullオプションとの相互運用性のために設計されています。

または

locate $something | while read f; do rm "$f"; done

また、*.origシェル展開を回避するために引用符で保護し、それをそのままの場所に渡す必要があります。


「シェル拡張」とはどういう意味ですか?
soldier.moth

2番目の例では+1。| while read私のホームディレクトリはスペースのあるファイルでいっぱいなので常に使用します。
マティー

@ Soldier.moth:現在のフォルダーにpattern *.origに対応するファイルがある場合、シェルはパターンをに拡張するfile1.orig file2.orig ...ためlocate、正確な文字列が正しく表示されません*.orig
enzotib 2010年

また、出力をgrepで検索することもできますtr '\n' '\0'
パブロビアンキ

2

そうでxargsはないxarg


それが私が意味していたことは、メモリからの質問を入力することでした。
soldier.moth

ああ、わかりました。後に間違ったコマンドを入力するとエラーが発生するように見えました|
maco

0

コマンドlocate *.orig | xargs rmは実際には機能しますが、起こっていたのは、ゴミ箱にあるファイルをlocate見つけ*.origて、ゴミ箱にあるファイルを削除しようとしたときrmにエラーを吐き出すNo such file or directoryことでした。


元の回答に「コメント」として情報を追加する必要があります。または、元の回答を編集できます。これはあなた自身の質問に対する答えではありません。
enzotib

エラーが発生した理由は、locateが* .origファイルをゴミ箱で見つけ、rmがそれらを削除できなかったためです。私はあなたの答えを受け入れ、他の両方の答えを上手に書いていて、後で来る人を助けるかもしれないので投票しました。
soldier.moth

0

Locateはグロビングを行いませんが、シェルは行います。シェルは* .origを、現在のディレクトリで* .origに一致するものに展開します。

使うだけ

locate .orig

そしてそれがあなたが必要なものを手に入れたら

locate .orig | xargs rm

または、エンゾチブが言及したように

locate -0 .orig | xargs -0 rm

ファイル名に空白がある場合。


0

トリック:すべてのパスをtmpファイルに保存します。次に、ループします:

#!/bin/bash
locate .orig /tmp/tmp.txt
while read line
do
    pth=$line
    rm "$pth" 
done < /tmp/tmp.txt

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