Non è sicuro analizzare ls
o eseguire il pipe find
[ 1 , 2 ]
Non è sicuro analizzare (e reindirizzare) l'output di ls
o find
, principalmente perché è possibile trovare nei nomi dei file caratteri non usuali come la nuova riga , la scheda ... Qui funzionerà un ciclo di shell puro [ cuonglm ] .
Anche il find
comando non convogliato con l'opzione -exec
funzionerà:
find ./*.png -exec basename {} .png \;
Aggiornamenti / Note : è possibile utilizzare find .
per cercare anche i file nascosti o find ./*.png
per ottenere solo quelli non nascosti. Con find *.png -exec ...
te puoi avere problemi nel caso fosse presente un file chiamato .png
perché find lo otterrà come opzione. È possibile aggiungere -maxdepth 0
per evitare di scendere nelle directory denominate come Dir_01.png
o find ./*.png -prune -exec ...
quando maxdepth non è consentito (grazie a Stéphane). Se si desidera evitare di elencare quelle directory, è necessario aggiungere l'opzione -type f
(che escluderebbe anche altri tipi di file non regolari). Dai un'occhiata a man
per un panorama più completo su tutte le opzioni disponibili e ricordati di controllare quando sono conformi a POSIX, per una migliore portabilità.
Qualche parola in più
Può succedere, ad esempio, che copiando il titolo da un documento e incollandolo nel nome file, una o più newline finiscano nel nome file stesso. Possiamo anche essere così sfortunati che un titolo può contenere anche la chiave che dobbiamo usare appena prima di una nuova riga:
The new art of working on .png
files and other formats.
Se vuoi testare, puoi creare nomi di file come questo con i comandi
touch "A file with two lines"$'\n'"and This is the second.png"
touch "The new art of working on .png"$'\n'"files and other formats.png"
L' /bin/ls *png
output semplice ?
invece dei caratteri non stampabili
A file with two lines?and This is the second.png
The new art of working on .png?files and other formats.png
In tutti i casi in cui si vuole inviare l'output del ls
o find
il seguente comando dovranno nessun accenno per capire se l'attuale linea deriva da un nuovo nome di file o se si segue una nuova riga carattere nel precedente nome del file . Un cattivo nome davvero , ma ancora legale.
Un ciclo di shell con shell Parameter-Expansion, ${parameter%word}
sia nella variante con printf
o echo
funzionerà [ cuonglm ], [ Anthon1 ] .
for f in *.png; do printf "%s\n" "${f%.png}" ; done
Dalla pagina man di Shell Parameter Expansion [ 3 ]
$ {parametro% word}
$ {parametro %% word}
... il risultato dell'espansione è il valore del parametro con il modello di corrispondenza più breve (il caso '%') o il modello di corrispondenza più lungo (il caso '%%') eliminato.
.
in loro. Anche se la convenzione dice di nominare i tuoi file.png
alla fine, non c'è motivo per cui non posso avere un file png chiamatofoo.zip
omy.picture.20160518
o solomypic
.