'Rm files *' rimuove tutte le corrispondenze da tutte le sottodirectory?


13

Voglio rimuovere qualsiasi file simile wordpress-891.sqlalla directory corrente (non all'interno delle sottodirectory).

Sarà rm wordpress-*.sqlfare il trucco o sarà anche rimuovere le partite dalle sotto-directory?


1
A parte questo, mentre tutte le altre risposte finiscono correttamente, c'è un altro colpo di scena: in realtà è bash, non il comando rm, che espande il carattere jolly. Se hai dieci file corrispondenti nella tua directory, rm non vedrà il carattere jolly, ma piuttosto dieci singoli argomenti. Se vuoi che rm esegua l'espansione, devi racchiudere l'argomento tra virgolette singole. Per rm, non fa differenza, ma in alcuni altri contesti può farlo. Di solito, quando il carattere jolly si riferisce a qualcosa di diverso dai file, come i pacchetti apt-get.
Kevin Keane,

3
@KevinKeane, rmnon fa l'espansione del nome file ... rm "foo*"proverebbe a rimuovere un file con un asterisco letterale nel nome.
ilkkachu,

Risposte:


20

No. Il normale globbing *non è ricorsivo e nemmeno lo è rm.

Se un nome di directory partite, ma non verranno rimossi - è necessario il -rflag per cancellare una directory.

Quindi è sicuro farlo se sei sicuro di voler eliminare quei file.

Puoi anche rendere rminterattivo

rm -i wordpress-*.sql

quindi chiederà conferma prima di eliminare ogni file


14

Sì, fa il trucco per te e rimuove tutti i file con quello schema nella directory corrente. E NO, non rimuove i file all'interno delle sottodirectory.

Quando mai non sei sicuro di cosa succede quando esegui un comando come:

rm wordpress-*.sql

quindi eseguilo semplicemente usando ls:

ls wordpress-*.sql

i file che vedi in output sono quelli che verranno rimossi.

Quando stai cercando di ottenere un elenco come foo*:, è meglio usare -dswitch with lsper evitare di elencare i file con una directory chiamata foobar/ecc.

ls -d foo*

Questo trucco funziona per i comandi che non sono usati per fare il lavoro in modo ricorsivo.

L'altra cosa che puoi fare è digitare l'input desiderato, ad esempio: wordpress-*quindi premi Ctrl+ Alt+ *, e ora tutte le corrispondenze vengono digitate automaticamente davanti al tuo comando.


4
Il mio metodo preferito:printf "%s\n" wordpress-*.sql
wjandrea,

1
Puoi anche fingere Echo come echo rm file*. -rf
Cerca

@eckes: puoi coprirli in modo più sicuro con rm ./*o rm -- *.
David Foerster,

Sì, oppure usa xargs -0@DavidFoerster
eckes

se vai ls foo*e hai una directory chiamata foobar, ottieni anche un elenco dei contenuti di quella directory, quindi chiaramente lsnon è davvero il modo migliore per quello che rmaccadrà
ilkkachu,


-1

Se desideri trovare ed eliminare tutti i file corrispondenti come wordpress-*.sql, puoi usare il findcomando. :)

Ad esempio, si desidera rimuovere tutti i file corrispondenti con wordpress-*.sqlunder test_dir, eseguire le seguenti operazioni.

cd test_dir
find . -name "wordpress-*.sql" -exec rm -f {} \;

Ogni volta che il findprogramma trova davvero un file corrispondente, tenta di eseguire un comando dopo l' -execopzione after . In questo caso rm -f {}verrà eseguito e {}verrà modificato nel nome del file di corrispondenza. Per esempio

rm -f wordpress-169.sql

È inoltre possibile impostare la profondità delle sottodirectory con l' -maxdepthopzione.

cd test_dir
find . -maxdepth 3 -name "wordpress-*.sql" -exec rm -f {} \;

Si noti che è necessario specificare l' -maxdepthopzione prima di altre opzioni. Altrimenti potresti incontrare i risultati che davvero non vuoi vedere.


1
OP vuole il contrario: non ricorrere alle sottodirectory.
Melebio

2
GNU find: "le opzioni influenzano tutti i test, inclusi i test specificati prima dell'opzione", l'elenco delle opzioni di seguito include -maxdepth. Usa -exec rm -f {} +piuttosto che -exec \;, o meglio ancora, solo-delete
ilkkachu
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.