In generale, la stringa vuota non indica la directory corrente, né ai comandi di shell né nelle chiamate di sistema. Lo ha fatto su alcuni sistemi meno recenti, ma non su sistemi compatibili con POSIX .
Di tanto in tanto troverai un programma che utilizza la directory corrente quando passi una stringa vuota e il programma si aspetta un nome di directory. Questo a volte è intenzionale, e talvolta un effetto collaterale di anteporre il percorso assoluto della directory corrente quando la stringa data non inizia con una barra.
La cosa migliore per te sarebbe lasciare il ./
. Non fa alcun male.
Se l'elenco dei file è per
find . … | sed 's!^\./!!'
Si noti che questo manipola alcuni nomi di file contenenti newline. Questo di solito non è un problema per il consumo umano e l'output di find
non è adatto al consumo del programma poiché è ambiguo. Se stai usando -print0
, che è adatto per il consumo del programma, probabilmente non ti interessa ./
comunque il prefisso.
Puoi usare find * …
invece di find . …
, ma nota che find *
ha una serie di difetti che lo rendono inadatto in generale:
.
è omesso.
- Tutti i file punto (file il cui nome inizia con
.
o ..`) vengono omessi.
- Se esiste un nome file nella directory corrente il cui nome inizia con
-
(o un file chiamato !
o (
...), verrà interpretato come un'opzione o predicato da find
.
Il primo punto non importa se il filtro esclude la directory corrente. Per il secondo punto, puoi usare i pattern ..?* .[!.]* *
per abbinare tutti i file nella directory corrente, ma dovrai controllare se ogni pattern corrisponde ad almeno un file e ometterlo se non lo fa. Questo è possibile ma molto ingombrante. L'ultimo punto è un tappo. Quindi find *
può essere adatto per l'uso della riga di comando di Quickie, ma non utilizzarlo in uno script.
Un approccio alternativo consiste nell'utilizzare la funzione di globbing ricorsiva della shell, ad es
printf '%s\n' **/*.h
Questo deve essere attivato da shopt -s globstar
in bash e da set -o globstar
in ksh93 e non esiste in una shell POSIX di base come dash. I file di punti non verranno attraversati per impostazione predefinita; per includerli, prima fai in modo che il globbing non ignori i file punto con shopt -s dotglob
in bash o FIGNORE='@(.|..)'
in ksh93. Inoltre, se non ci sono corrispondenze, questo comando stampa il motivo; corri shopt -s nullglob
in bash per stampare invece una riga vuota e usa il modello ~(N)**/*.h
in ksh.
In zsh, il globbing ricorsivo è attivo per impostazione predefinita. Utilizzare il qualificatore glob D
per includere file dot e N
stampare una riga vuota se non ci sono corrispondenze (per impostazione predefinita, zsh genera un errore se un modello non corrisponde a nessun file). Puoi usare printf
come sopra o
print -rl -- **/*.h(DN)
find
ha il parametro -printf per manipolare la modalità di visualizzazione dei risultati.find . -name '*.h' -printf '%P\n'
rimuoverà il./
prefisso. Guarda cosafind . -name '*.h' -print
fa.