Pipa hasil cari ke rm


11

Saya mencoba berlari

locate *.orig | xargs rm

tapi katanya No such file or directory

Saya telah melihat cara untuk melakukannya dengan findtetapi mencari mengembalikan path lengkap ke objek sehingga harus dimungkinkan

Jawaban:


20

Jika nama file mengandung spasi, Anda harus menggunakan

locate -0 $something | xargs -0 rm

Dari locatehalaman manual :

-0, --nullPisahkan entri pada keluaran menggunakan karakter ASCII NUL alih-alih menulis setiap entri pada baris terpisah. Opsi ini dirancang untuk interoperabilitas dengan opsi --null dari GNU xargs (1).

atau

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

Juga, Anda harus melindungi *.origdengan tanda kutip, untuk menghindari ekspansi shell, dan meneruskannya agar tidak tersentuh.


Apa yang Anda maksud dengan "ekspansi shell"?
soldier.moth

+1 untuk contoh kedua Anda. Saya selalu menggunakan | while readkarena direktori home saya penuh dengan file dengan spasi.
matpie

@ Soldier.moth: jika dalam folder saat ini ada file yang sesuai dengan pola *.orig, shell akan memperluas pola ke, katakanlah file1.orig file2.orig ...,, sehingga locatetidak akan melihat string yang tepat *.origsebagaimana mestinya.
enzotib

Juga untuk menemukan keluaran yang Anda bisa tr '\n' '\0'.
Pablo Bianchi

2

Ini xargstidakxarg


Itulah yang saya maksudkan adalah mengetik pertanyaan dari ingatan terima kasih.
soldier.moth

Oh oke. Itu tampak seperti kesalahan Anda akan mendapatkan menempatkan perintah yang salah setelah |
maco

0

Perintah locate *.orig | xargs rmitu benar-benar berfungsi tetapi yang terjadi adalah locatemenemukan *.origfile di tempat sampah dan rmmeludahkan kesalahan No such file or directoryketika mencoba menghapus file di tempat sampah.


Anda harus menambahkan informasi sebagai "komentar" ke jawaban asli, atau Anda dapat mengedit jawaban asli. Ini bukan jawaban untuk pertanyaan Anda sendiri.
enzotib

Ini adalah jawaban untuk pertanyaan saya alasan saya mendapatkan kesalahan adalah karena cari menemukan file * .orig di tempat sampah dan rm tidak dapat menghapusnya. Saya menerima jawaban Anda dan memilih kedua jawaban lainnya karena semuanya ditulis dengan baik dan mungkin membantu seseorang yang datang kemudian.
soldier.moth

0

loc tidak melakukan globbing, tetapi shell tidak. Shell memperluas * .orig ke apa yang ditemukannya di direktori saat ini yang cocok dengan * .orig.

Gunakan saja

locate .orig

dan jika itu membuat Anda mendapatkan apa yang Anda butuhkan

locate .orig | xargs rm

atau, seperti yang disebutkan oleh enzotib

locate -0 .orig | xargs -0 rm

jika Anda memiliki Whitespace di nama file.


0

Trik: Simpan semua jalur dalam file tmp. kemudian, Loop di atasnya:

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

rm -rf /tmp/tmp.txt 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.