Puoi anche usare il printf
comando, invece di echo:
printf '%s\n' *
printf
è superiore a echo
in questa situazione in quanto echo
fa non rispettare il "doppio trattino" ( --
) per indicare la fine della lista degli argomenti (su alcuni sistemi, tra cui Ubuntu 14.04 che è quello che ho testato su):
llama@llama:~$ mkdir -p Misc/unix210948
llama@llama:~$ cd !$
cd Misc/unix210948
llama@llama:~/Misc/unix210948$ touch -- -n
llama@llama:~/Misc/unix210948$ ls
-n
llama@llama:~/Misc/unix210948$ echo *
llama@llama:~/Misc/unix210948$ echo -- *
-- -n
llama@llama:~/Misc/unix210948$ printf '%s\n' *
-n
In questo caso, non è possibile ottenere il risultato desiderato con echo
(poiché un file chiamato -n
viene interpretato come un'opzione e il doppio trattino non funziona, quindi è necessario utilizzare printf
).
Nota che dovresti sempre usare una stringa di formato come sopra quando fare con dati sconosciuti printf
, poiché altrimenti potresti ricevere risultati inaspettati (grazie a @ G-Man per averlo sottolineato nei commenti!):
llama@llama:~/Misc/unix210948$ rm ./-n
llama@llama:~/Misc/unix210948$ touch '\n'
llama@llama:~/Misc/unix210948$ ls
\n
llama@llama:~/Misc/unix210948$ printf -- *
llama@llama:~/Misc/unix210948$ printf '%s\n' *
\n
Un file chiamato \n
viene interpretato come una nuova riga da printf
. Per evitare ciò, usiamo una stringa di formattazione per printf
( %s
) e le passiamo i nomi dei file (espansi via globbing, come prima).
Questa printf
soluzione + stringa di formattazione può gestire un'ampia varietà di nomi di file (e tratta anche file "nascosti", ovvero quelli che iniziano con un .
, lo stesso dils
):
llama@llama:~/Misc/unix210948$ rm ./*
zsh: sure you want to delete all the files in /home/llama/Misc/unix210948/. [yn]? y
llama@llama:~/Misc/unix210948$ touch -- '-n' '\n' 'name with spaces' '.hidden'
llama@llama:~/Misc/unix210948$ ls
-n \n name with spaces
llama@llama:~/Misc/unix210948$ printf '%s\n' *
-n
\n
name with spaces
Se il tuo printf
supporto %q
, puoi anche usare quello ( printf '%q\n' *
). Questo sfuggirà a spazi, newline, ecc. Se ci sono caratteri strani nei nomi dei file. (Grazie a @muru in chat per averlo segnalato !)
libc*so
ld-linux*so