Réponses:
Similaire à la toute première option, mais omet le délimiteur de fin
ls -1 | paste -sd "," -
pasteobtient -(entrée standard) par défaut, au moins sur mon paste (GNU coreutils) 8.22.
"\0", donc a paste -sd "\0" -fonctionné pour moi!
EDIT : Simplement " ls -m " Si vous voulez que votre délimiteur soit une virgule
Ah, la puissance et la simplicité!
ls -1 | tr '\n' ','
Changez la virgule " , " en ce que vous voulez. Notez que cela inclut une "virgule de fin"
\n, cela le remplacera également.
ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
sedpourriez être un peu plus efficace avec le caractère marqueur de fin:ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sedaprès trsemble juste pour supprimer le dernier symbole semble déraisonnable. Je pars avecls -1 | tr '\n' ',' | head -c -1
Cela remplace la dernière virgule par une nouvelle ligne:
ls -1 | tr '\n' ',' | sed 's/,$/\n/'
ls -m inclut des sauts de ligne au niveau de la largeur de l'écran (80e par exemple).
Surtout Bash (uniquement lsexterne):
saveIFS=$IFS; IFS=$'\n'
files=($(ls -1))
IFS=,
list=${files[*]}
IFS=$saveIFS
Utiliser readarray(aka mapfile) dans Bash 4:
readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS
Merci à gniourf_gniourf pour les suggestions.
mapfile(Bash ≥4) comme: mapfile -t files < <(ls -1). Pas besoin de jouer avec IFS. Et c'est plus court aussi.
IFSpour rejoindre les champs: saveIFS=$IFS; IFS=,; list=${files[*]}; IFS=$saveIFS. Ou utilisez une autre méthode si vous voulez un séparateur avec plus d'un caractère.
Je pense que celui-ci est génial
ls -1 | awk 'ORS=","'
ORS est le "séparateur d'enregistrements de sortie" donc maintenant vos lignes seront jointes par une virgule.
" OR ")
La combinaison de la configuration IFSet de l'utilisation de "$*"peut faire ce que vous voulez. J'utilise un sous-shell donc je n'interfère pas avec $ IFS de ce shell
(set -- *; IFS=,; echo "$*")
Pour capturer la sortie,
output=$(set -- *; IFS=,; echo "$*")
setfonctionnement? Ça me ressemble un peu au vaudou. un regard superficiel à travers man setne m'a pas rapporté beaucoup d'informations non plus.
setun tas d'arguments mais pas d'options, il définit les paramètres de position ($ 1, $ 2, ...). --est là pour protéger setau cas où le premier argument (ou nom de fichier dans ce cas) arriverait à commencer par un tiret. Voir la description de l' --option dans help set. Je trouve que les paramètres positionnels sont un moyen pratique de gérer une liste de choses. J'aurais également pu implémenter cela avec un tableau:output=$( files=(*); IFS=,; echo "${files[*]}" )
type setvous le dira, set is a shell builtin. Donc, ça man setn'aidera pas, mais help setça ira. Réponse: "- Attribuez tous les arguments restants aux paramètres de position."
set -- *. L' expansion Retarder d' *un niveau vous pouvez obtenir la sortie correcte sans qu'il soit nécessaire d'une coquille sous: IFS=',' eval echo '"$*"'. Bien sûr, cela changera les paramètres de position.
L'analyse lsen général n'est pas conseillée , donc une meilleure alternative est d'utiliser find, par exemple:
find . -type f -print0 | tr '\0' ','
Ou en utilisant findet paste:
find . -type f | paste -d, -s
Pour joindre généralement plusieurs lignes (non liées au système de fichiers), vérifiez: «Join» concis et portable sur la ligne de commande Unix .
Ne réinventez pas la roue.
ls -m
C'est exactement cela.
ls -met trpour supprimer l'espace après la virgule, vous feriezls -m | tr -d ' '
sed 's/, /,/g
bash juste
mystring=$(printf "%s|" *)
echo ${mystring%|}
|, @camh.
bashet gnu coreutilsprintf
printf -vne fonctionnera qu'en bash, tandis que la réponse présentée fonctionne sur de nombreux types de shell.
|, à condition que les deux lignes sont utilisées: printf -v mystring "%s|" * ; echo ${mystring%|}.
Cette commande est destinée aux fans de PERL:
ls -1 | perl -l40pe0
Ici 40 est le code ascii octal pour l'espace.
-p traitera ligne par ligne et imprimera
-l se chargera de remplacer le \ n de fin par le caractère ascii que nous fournissons.
-e est d'informer PERL que nous faisons l'exécution en ligne de commande.
0 signifie qu'il n'y a en fait aucune commande à exécuter.
perl -e0 est identique à perl -e ''
Il semble que les réponses existent déjà.
Si vous voulez un
a, b, cformat, utilisez ls -m( réponse de Tulains Córdova )
Ou si vous voulez un a b cformat, utilisez ls | xargs(version simplifiée de la réponse de Chris J )
Ou si vous voulez un autre délimiteur comme |, utilisez ls | paste -sd'|'(application de la réponse d' Artem )
La voie sed,
sed -e ':a; N; $!ba; s/\n/,/g'
# :a # label called 'a'
# N # append next line into Pattern Space (see info sed)
# $!ba # if it's the last line ($) do not (!) jump to (b) label :a (a) - break loop
# s/\n/,/g # any substitution you want
Remarque :
Ceci est de complexité linéaire, ne se substituant qu'une seule fois après que toutes les lignes ont été ajoutées dans le Pattern Space de sed.
@ La réponse d'AnandRajaseka , et quelques autres réponses similaires, comme ici , sont O (n²), car sed doit faire un substitut chaque fois qu'une nouvelle ligne est ajoutée dans le Pattern Space.
Comparer,
seq 1 100000 | sed ':a; N; $!ba; s/\n/,/g' | head -c 80
# linear, in less than 0.1s
seq 1 100000 | sed ':a; /$/N; s/\n/,/; ta' | head -c 80
# quadratic, hung
En plus de la réponse de majkinetor, voici la façon de supprimer le délimiteur de fin (car je ne peux pas encore commenter sous sa réponse):
ls -1 | awk 'ORS=","' | head -c -1
Supprimez simplement autant d'octets de fin que votre délimiteur compte.
J'aime cette approche car je peux utiliser des délimiteurs multi-caractères et d'autres avantages de awk:
ls -1 | awk 'ORS=", "' | head -c -2
ÉDITER
Comme Peter l'a remarqué, le nombre d'octets négatifs n'est pas pris en charge dans la version native de head de MacOS. Cependant, cela peut être facilement résolu.
Tout d'abord, installez coreutils. "Les utilitaires GNU Core sont les utilitaires de base de manipulation de fichiers, de shell et de texte du système d'exploitation GNU."
brew install coreutils
Les commandes également fournies par MacOS sont installées avec le préfixe "g". Par exemple gls.
Une fois que vous avez fait cela, vous pouvez utiliser gheadun nombre d'octets négatif, ou mieux, créer un alias:
alias head="ghead"
Si votre version de xargs prend en charge l'indicateur -d, cela devrait fonctionner
ls | xargs -d, -L 1 echo
-d est le drapeau de délimitation
Si vous n'avez pas -d, vous pouvez essayer ce qui suit
ls | xargs -I {} echo {}, | xargs echo
Le premier xargs vous permet de spécifier votre délimiteur qui est une virgule dans cet exemple.
-dspécifie le délimiteur d'entrée avec des xargs GNU, donc ne fonctionnera pas. Le deuxième exemple présente le même problème que d'autres solutions ici d'un délimiteur errant à la fin.
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
Explication:
-e- indique une commande à exécuter
:a- est une étiquette
/$/N- définit la portée de la correspondance pour la ligne actuelle et la ligne (N) ext
s/\n/\\n/;- remplace tous les EOL par \n
ta;- goto étiquette a si la correspondance est réussie
Tiré de mon blog .
Vous pouvez utiliser:
ls -1 | perl -pe 's/\n$/some_delimiter/'
lsproduit une sortie de colonne lorsqu'il est connecté à un tuyau, il -1est donc redondant.
Voici une autre réponse Perl utilisant la joinfonction intégrée qui ne laisse pas de délimiteur de fin:
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
L'obscur -0777fait perl lire toutes les entrées avant d'exécuter le programme.
alternative sed qui ne laisse pas de délimiteur de fin
ls | sed '$!s/$/,/' | tr -d '\n'
lsa la possibilité -mde délimiter la sortie avec ", "une virgule et un espace.
ls -m | tr -d ' ' | tr ',' ';'
canaliser ce résultat pour trsupprimer l'espace ou la virgule vous permettra de rediriger le résultat trpour remplacer le délimiteur.
dans mon exemple, je remplace le délimiteur ,par le délimiteur;
remplacez-le ;par le délimiteur que vous préférez, car tr ne représente que le premier caractère des chaînes que vous passez en arguments.
Version Perl rapide avec gestion des barres obliques de fin:
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'
Expliquer:
ls -1 | paste -s -d ":" -je ne sais pas si c'est universel avec toutes les versions de pâte