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ò?
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:
Semplicemente:
find . ! -name '*2013*'
Aggiungi a ! -type d
per escludere anche i file della directory dei tipi (come .
se stesso) o -type f
per 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 2013
se è 2013
stato 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éphane2013
file 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 find
nella locale C:
LC_ALL=C find . ! -name '*2013*'
I modelli di nome file Ksh sono sufficienti:
# files with 2013
ls -d -- *2013*
# files without 2013
ls -d -- !(*2013*)
Se la tua shell è bash, devi eseguire shopt -s extglob
prima 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, ls
potrebbe non essere il comando giusto da usare. Per memorizzarli in un array
filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done
Trova tutti i file nella directory corrente che non contiene una determinata stringa, qui "2013":
find . ! -name "*2013*" -type f
ls
restituirà un messaggio di errore se il modello non corrisponde a nessun file). Si noti inoltre cheksh
ordinerà l'elenco.