[Linux] Come unire più righe di nomi di file in uno con delimitatore personalizzato?



Answers

EDIT : Semplicemente " ls -m " Se vuoi che il tuo delimitatore sia una virgola

Ah, il potere e la semplicità!

ls -1 | tr '\n' ','

Cambia la virgola " , " per quello che vuoi. Nota che questo include una "virgola finale"

Question

Mi piacerebbe unire il risultato di ls -1 in una riga e delimitarla con quello che voglio.

Ci sono dei comandi Linux standard che posso usare per ottenere questo?




ls produce un output di colonna quando è collegato a una pipe, quindi il -1 è ridondante.

Ecco un'altra risposta perl usando la funzione builtin join che non lascia un delimitatore finale:

ls | perl -F'\n' -0777 -anE 'say join ",", @F'

L'oscuro -0777 fa in modo che perl legga tutto l'input prima di eseguire il programma.

alternativa alternativa che non lascia un delimitatore finale

ls | sed '$!s/$/,/' | tr -d '\n'



L'analisi in genere non è consigliata , per cui un modo migliore alternativo è usare find , ad esempio:

find . -type f -print0 | tr '\0' ','

O utilizzando la funzione find e paste :

find . -type f | paste -d, -s

Per l'unione generale di più righe (non correlate al file system), controllare: "join" conciso e portatile sulla riga di comando Unix .




Puoi usare:

ls -1 | perl -pe 's/\n$/some_delimiter/'



Questo comando è per i fan del PERL:

ls -1 | perl -l40pe0

Qui 40 è il codice ottale degli ascii per lo spazio.

-p elaborerà linea per linea e stamperà

-l si prenderà cura di sostituire il trailing \ n con il carattere ascii che forniamo.

-e è quello di informare PERL che stiamo eseguendo la riga di comando.

0 significa che in realtà non esiste alcun comando da eseguire.

perl -e0 è uguale a perl -e ''




solo bash

mystring=$(printf "%s|" *)
echo ${mystring%|}



ls ha l'opzione -m di delimitare l'output con ", " una virgola e uno spazio.

ls -m | tr -d ' ' | tr ',' ';'

pipettare questo risultato per tr per rimuovere lo spazio o la virgola consentirà di reindirizzare nuovamente il risultato a tr per sostituire il delimitatore.

nel mio esempio sostituisco il delimitatore , con il delimitatore ;

sostituire ; con qualsiasi delimitatore di caratteri che preferisci dato che tr rappresenta solo il primo carattere nelle stringhe che passi come argomenti.




La combinazione di impostare IFS e l'uso di "$*" può fare ciò che vuoi. Sto usando una subshell quindi non interferisco con $ IFS di questa shell

(set -- *; IFS=,; echo "$*")

Per catturare l'output,

output=$(set -- *; IFS=,; echo "$*")



Sembra che le risposte esistano già.

Se vuoi a, b, c formato a, b, c , usa ls -m ( la risposta di Tulains Córdova )

O se vuoi il formato abc , usa ls | xargs ls | xargs (versione semplificata della risposta di Chris J )

O se vuoi altri delimitatori come | , usa ls | paste -sd'|' ls | paste -sd'|' (applicazione della risposta di Artem )




Links