Voglio reindirizzare i nomi dei file ad altri programmi, ma tutti si strozzano quando i nomi contengono spazi.
Diciamo che ho un file chiamato.
foo bar
Come posso ottenere find
per restituire il nome corretto?
Ovviamente voglio:
foo\ bar
o:
"foo bar"
EDIT : Non voglio passare attraverso xargs
, voglio ottenere una stringa correttamente formattata in find
modo da poter reindirizzare la stringa di nomi di file direttamente a un altro programma.
find
formatta bene i nomi dei file; sono scritti un nome per riga. (Naturalmente, questo è ambiguo se un nome file contiene un carattere di nuova riga.) Quindi il problema è che la parte ricevente "soffoca" quando ottiene uno spazio, il che significa che devi dirci qual è la parte ricevente se vuoi una risposta significativa .
find
offrire un'opzione per produrre nomi di file in un formato adatto alla shell. In generale, tuttavia, l' estensione -print0
GNU find
funziona bene anche per molti altri scenari e dovresti imparare ad usarlo in ogni caso.
ls $(command...)
non sfoglia l'elenco stdin
. Mette l'output di $(command...)
direttamente nella riga di comando. In tal caso, è la shell che sta leggendo da c, e utilizzerà il valore corrente di $IFS
per decidere come dividere le parole dell'output. In generale, stai meglio usando xargs
. Non noterai un hit da prestazione.
find -printf '"%p"\n'
aggiungerà virgolette doppie intorno a ciascun nome trovato, ma non citerà correttamente le doppie virgolette in un nome file. Se i nomi dei tuoi file non hanno virgolette doppie incorporate, puoi ignorare il problema: oppure esegui il pipe through sed 's/"/&&/g;s/^""/"/;s/""$/"/'
. Se i nomi dei tuoi file finiscono per essere gestiti dalla shell, dovresti probabilmente usare virgolette singole invece che doppie (altrimenti sweet$HOME
diventerà qualcosa di simile sheet/home/you
). E questo non è ancora molto robusto rispetto ai nomi dei file con nuove righe al loro interno. Come vuoi gestirli?
-exec
bandiera confind
? potresti potenzialmente alleviare questo errore e rendere il tuo comando più efficiente eseguendo-exec
invece il piping ad altri comandi. Solo il mio $ 0,02