opzioni alternative a rm -f


10

Vorrei eseguire una riga di comando:

cd ~/www/tmp/; rm -P 2*

Ma ricevo un errore se non ci sono file che iniziano con 2.

Penseresti che vorrei usare -f, tuttavia:

-f      Attempt to remove the files without prompting for confirmation, regardless of the file's permissions.  If the file does not exist, do not display a diagnostic message or modify the exit status to reflect an error.

E io faccio cura di file di permissions- se c'è qualcosa di strano sta succedendo, io preferirei il comando di interruzione. Voglio solo eliminare gli errori "non esistono".

Ho esaminato alcune altre domande con "errori rm" e ho trovato queste due cose che sembrano (in qualche modo) rilevanti:

Elimina file e directory con i loro nomi. Nessun file o directory con questo nome

Ma non capisco tutto quello che succede nelle risposte a questa domanda e non so che ne ho bisogno?

L' touchhack ha suggerito in questa domanda:

Rm non ha segnalato quando manca un file?

Sembra fattibile, dato che non penso di pensare al colpo di prestazione (ma che tipo di colpo di prestazione porteresti? - cioè: è una tecnica ragionevolmente scalabile o sto solo imparando cattive abitudini?)

Non sono sicuro di come farei if-thenall'interno della riga di comando.

Esistono altre opzioni per una semplice pulizia cut-n-paste della riga di comando?

Funzionerebbe find -deletemeglio per il mio caso? Se è così, perché?


errore in questione:

rm: 2*: No such file or directory

1
L'errore è dalla tua shell, no rm, quindi dovrai dire di cosa si tratta.
Michael Homer,

Stai usando zshcome shell interattiva? Stai ricevendo un No matches founderrore?
Kusalananda

2
@MichaelHomer No, l'errore proviene da rm. La shell ha semplicemente passato la stringa 2*a rm invece di espanderla in un elenco di file. Guarda l'errore in questione: dice che rm si sta lamentando, non sh / bas / zsh / ...
doneal24

Risposte:


13

Per chiamare solo rm -Pper esistenti i file regolari i cui nomi corrispondono un modello in una directory (ma non al di sotto):

find directory -maxdepth 1 -type f -name 'pattern' -exec rm -P {} +

Per esempio,

find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +

Per abbinare solo le non directory, utilizzare ! -type dal posto di -type f. La differenza ! -type dsarebbe vera per una gamma più ampia di tipi di file (collegamenti simbolici, pipe denominate, socket, ecc.)

Dal momento che si desidera che vengano richieste alcune condizioni sui file trovati, non utilizzare al -deleteposto di -exec rmpoiché funziona come rm -f.

Rimuovi -maxdepth 1per lasciare findricorsivamente le sottodirectory.


3
Anche se ! -type dpotrebbe essere più vicino rm 2*, penso?
muru,

Quindi, dovrei aggiungere -P per ottenere quella funzionalità ?:find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +
user3082

@ user3082 Sì, ho dimenticato che volevi usare -Panche tu .
Kusalananda

Grazie @muru, in realtà lo voglio -type f, ma non sapevo come rmcomportarmi in quel modo - quindi il suggerimento di @ Kusalanada era perfetto e la differenziazione / spiegazione è ottima per l'apprendimento.
user3082,

@ user3082 probabilmente dovresti usare il globbing esteso della tua shell (ad esempio, rm 2*(.)in zsh).
Muru,
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.