Réponses:
Similaire à la toute première option, mais omet le délimiteur de fin
ls -1 | paste -sd "," -
paste
obtient -
(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/'
sed
pourriez être un peu plus efficace avec le caractère marqueur de fin:ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sed
après tr
semble 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 ls
externe):
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.
IFS
pour 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 IFS
et 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 "$*")
set
fonctionnement? Ça me ressemble un peu au vaudou. un regard superficiel à travers man set
ne m'a pas rapporté beaucoup d'informations non plus.
set
un tas d'arguments mais pas d'options, il définit les paramètres de position ($ 1, $ 2, ...). --
est là pour protéger set
au 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 set
vous le dira, set is a shell builtin
. Donc, ça man set
n'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 ls
en 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 find
et 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 -m
et tr
pour supprimer l'espace après la virgule, vous feriezls -m | tr -d ' '
sed 's/, /,/g
bash juste
mystring=$(printf "%s|" *)
echo ${mystring%|}
|
, @camh.
bash
et gnu coreutilsprintf
printf -v
ne 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, c
format, utilisez ls -m
( réponse de Tulains Córdova )
Ou si vous voulez un a b c
format, 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 ghead
un 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.
-d
spé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/'
ls
produit une sortie de colonne lorsqu'il est connecté à un tuyau, il -1
est donc redondant.
Voici une autre réponse Perl utilisant la join
fonction intégrée qui ne laisse pas de délimiteur de fin:
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
L'obscur -0777
fait 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'
ls
a la possibilité -m
de délimiter la sortie avec ", "
une virgule et un espace.
ls -m | tr -d ' ' | tr ',' ';'
canaliser ce résultat pour tr
supprimer l'espace ou la virgule vous permettra de rediriger le résultat tr
pour 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