Iniettare i risultati di individuare in rm


11

Ho provato a correre

locate *.orig | xargs rm

ma diceva No such file or directory

Ho visto dei modi per farlo, findma Locate restituisce il percorso completo dell'oggetto quindi dovrebbe essere possibile

Risposte:


20

Se i nomi dei file contengono spazi che dovresti usare

locate -0 $something | xargs -0 rm

Dalla locatepagina man :

-0, --nullSeparare le voci nell'output utilizzando il carattere ASCII NUL anziché scrivere ciascuna voce su una riga separata. Questa opzione è progettata per l'interoperabilità con l'opzione --null di GNU xargs (1).

o

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

Inoltre, dovresti proteggere *.origcon le virgolette, per evitare l'espansione della shell e passarlo per localizzarlo intatto.


Cosa intendi con "espansione della shell"?
soldier.moth,

+1 per il tuo secondo esempio. Uso sempre | while readpoiché la mia directory home è piena di file con spazi.
matpie,

@ Soldier.moth: se nella cartella corrente ci sono file corrispondenti al modello *.orig, la shell espande il modello a, diciamo file1.orig file2.orig ..., in modo che locatenon vedrà la stringa esatta *.origcome dovrebbe.
enzotib,

Anche per grep individuare l'output è quindi possibile tr '\n' '\0'.
Pablo Bianchi,

2

Non lo xargsèxarg


Questo è ciò che intendevo dire scrivere la domanda dalla memoria, grazie.
soldier.moth,

Oh va bene. Sembrava l'errore che avresti ricevuto inserendo un comando errato dopo |
maco,

0

Il comando locate *.orig | xargs rmfunziona davvero, ma quello che stava succedendo era che locatestava trovando i *.origfile nel cestino e rmsputava l'errore No such file or directoryquando si cercava di eliminare i file nel cestino.


È necessario aggiungere informazioni come "commento" alla risposta originale, oppure è possibile modificare la risposta originale. Questa non è una risposta alla tua domanda.
enzotib,

È una risposta alla mia domanda il motivo per cui stavo ricevendo l'errore era perché individuare stava trovando i file * .orig nel cestino e rm non riusciva a eliminarli. Ho accettato la tua risposta e ho votato entrambe le risposte perché erano ben scritte e potrebbero aiutare qualcuno che verrà dopo.
soldier.moth,

0

individuare non fa tremare, ma lo fa la shell. La shell espande * .orig a ciò che trova nella directory corrente che corrisponde a * .orig.

Basta usare

locate .orig

e se questo ti procura ciò di cui hai bisogno

locate .orig | xargs rm

o, come menzionato da enzotib

locate -0 .orig | xargs -0 rm

se hai spazi bianchi nei nomi dei file.


0

Un trucco: salva tutti i percorsi nel file tmp. quindi, Loop su di esso:

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

rm -rf /tmp/tmp.txt 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.