Trova i nomi dei file che non contengono una stringa specificata


19

Vorrei eseguire il contrario di:

find . -name "*2013*"

Trova tutti i file nella directory corrente che non contengono la stringa "2013" nei loro nomi. Come posso fare ciò?

Risposte:


28

Semplicemente:

find . ! -name '*2013*'

Aggiungi a ! -type dper escludere anche i file della directory dei tipi (come .se stesso) o -type fper includere solo i file regolari , escludendo tutti gli altri tipi di file (directory, fifo, collegamenti simbolici, dispositivi, socket ...).

Attenzione, tuttavia, che *corrisponde a una sequenza di 0 o più caratteri . Quindi potrebbe riportare nomi di file che contengono 2013se è 2013stato preceduto o seguito da qualcosa che non può essere completamente decodificato come caratteri validi nella locale corrente.

Ciò può accadere se ti trovi in ​​una locale in cui i caratteri possono essere codificati su più di un byte (come in UTF-8) per i nomi di file che sono codificati in una codifica diversa. Ad esempio, in una locale UTF-8, segnalerebbe un Stéphane2013file se éfosse stato codificato nel set di caratteri iso8859-15 (come byte 0xe9).

La cosa migliore sarebbe assicurarsi che i nomi dei file siano codificati nel set di caratteri della locale, ma se non è possibile garantirlo, è necessario eseguire una soluzione findnella locale C:

LC_ALL=C find . ! -name '*2013*'

4

I modelli di nome file Ksh sono sufficienti:

# files with 2013
ls -d -- *2013*

# files without 2013
ls -d -- !(*2013*)

Riferimento

Se la tua shell è bash, devi eseguire shopt -s extglobprima di poter usare questo modello (puoi inserirlo nel tuo .bashrc). Se la tua shell è zsh, devi eseguirla setopt ksh_glob(puoi metterla nella tua .zshrc). Zsh offre anche ls -d -- ^*2013*, che richiede un preliminare setopt extended_glob.

A seconda di cosa stai facendo con questi nomi di file, lspotrebbe non essere il comando giusto da usare. Per memorizzarli in un array

filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done

4
Ciò non ricorre nelle sottodirectory e salterà i file punto (e lsrestituirà un messaggio di errore se il modello non corrisponde a nessun file). Si noti inoltre che kshordinerà l'elenco.
Stéphane Chazelas,

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.