Comment puis-je faire écho à seulement 1 colonne de sortie de la commande ls?

55

Disons que lorsque je commande ls, la sortie est:

file1 file2 file3 file4

Est-il possible d'afficher uniquement une certaine colonne de sortie, dans ce cas, fichier2? J'ai essayé ce qui suit sans succès:

echo ls | $2

Fondamentalement, tout ce que je veux faire est de faire écho à la deuxième colonne, dans ce cas, je veux faire écho:

file2
John
la source
2
Quelle est une situation dans laquelle vous voulez vraiment une colonne de lssortie?
Michas
11
En règle générale, vous ne devriez jamais analyser ls . Il y a presque toujours de meilleurs moyens d'obtenir les informations dont vous avez besoin.
terdon
Je ne le ferais pas étranger: P (AllWays désolé I aimé cette phrase) le nombre de colonnes dépendent des fichiers de noms et les dossiers ont, donc 2ème colonne peut être celle que vous voulez, ou non, ou peut - être dans l' un lset après avoir créé des fichiers / dossiers, il se peut que ce ne soit plus ce que vous souhaitiez. Comme Terdon l'a souligné, il existe de meilleures façons d'obtenir ce que vous voulez
YoMismo

Réponses:

83

La commande suivante formatera la sortie ls dans une colonne

ls -1 /directory
ch0ps
la source
2
Mais cela ne vous donne pas seulement la colonne qui intéresse le PO.
Anthon
1
Pour le rendre correct: ls -1 /directory | head -2 | tail -1ouls -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz
@KWubbufetowicz ls | sed -n '1p;q'semble plus simple
Fiximan
3
La réponse que je cherchais, mais pas la question de l'OP.
Michael Lang
36

Vous recherchez ceci:

ls -C | awk '{ print $2 }'

Cependant, en supposant que vous essayiez d'utiliser ce nom de fichier ultérieurement, ne le faites pas, car les noms de fichiers contenant des espaces sont brisés. Au lieu de cela, placez les fichiers dans un tableau et obtenez le second, ce qui vous évite d'avoir à analyser du tout:

files=(*)
printf '%s\n' "${files[1]}"

L'ordre dans lequel vous récupérez les fichiers dépend de la valeur de LC_COLLATE. En tant que tel, vous pouvez définir le paramètre en LC_COLLATE=Cpremier si vous souhaitez un tri "standard" dans tous les cas.

Chris Down
la source
Notez que les indices de matrice commencent 1par les coquilles sensibles (zsh, yash, fish, csh, tcsh, rc, es ...) et 0par ksh et bash. Pour une solution portable à tous Bourne comme des coquillages, vous pouvez utiliser: à la set -- *; printf '%s\n' "$2"place.
Stéphane Chazelas
@ StéphaneChazelas Au moins pour cette question, les balises incluent "bash", donc cette réponse est spécifique à ce shell.
Chris Down
ls -C | awk '{print $ 1} semble donner le même résultat ... pourquoi $ 2?
boctulus le
7

Vous auriez besoin d'ajouter en -Ctant lsqu'utilise le mode colonne unique lorsque la sortie n'est pas un terminal. awkaffiche ensuite la deuxième colonne:

ls -C | awk '{print $2}'
tkrennwa
la source
2

Je pense que tu cherches

ls -1

Il n'affichera pas l'autorisation, le propriétaire, le groupe, la date, la taille ... mais un nom de fichier simple dans une seule colonne.

Niti
la source
1
Non seulement cette réponse est fausse, mais elle a déjà été donnée auparavant.
Scott
Bien que je réalise que ce n’est pas le cas pour la question initiale, c’est ce que je cherchais. Alors merci.
AntumDeluge
0

Le seul moyen qui fonctionne pour moi est d'ajouter "-all". C'est:

ls -C -all | awk '{ print $1 }'

Parce que -allajouter plus de colonnes comme utilisateur, autorisations, etc.

Diego Andrés Díaz Espinoza
la source
0

Comme cela a déjà été mentionné, l'utilisation de colonnes pour l'analyse de la lssortie n'est pas très robuste, car elle lscoupe les lignes en fonction de la longueur de votre nom de fichier et de la largeur du terminal. Cependant, il est souvent intéressant d’afficher une seule colonne d’une liste d’éléments. Vous pouvez le faire en utilisant la commande cut:

echo file1 file2 file3 file4 | cut -d" "  -f2

Affichera

file2

Notez que cela -dvous permet de sélectionner le délimiteur de colonne, donc par exemple avec

cur -d, -f2

vous pouvez afficher la deuxième colonne d'une liste séparée par des virgules.

Un roebel
la source
0

Supposons que si vous souhaitez afficher uniquement le nom de fichier particulier sous le chemin actuel, utilisez la commande ci-dessous.

commander:

find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"
Praveen Kumar BS
la source
0

C'est délicat, car l'analyse ls -Cdépend de:

  1. longueur du nom de fichier ((qui dépend elle-même de la liste de fichiers spécifiée passée à ls -C)
  2. largeur terminale.
  3. le fait que la ls -Csortie soit en colonne, mais peut être configuré avec un nombre d'espaces variable comme séparateur de champ.
  4. la possibilité d'espaces dans les noms de fichiers (dont l'affichage dépend des lsoptions d'affichage choisies).

Pour le moment, commençons par le problème le plus facile ( c’est-à-dire pas le numéro 4 ci-dessus), en supposant qu’il n’y ait pas d’espace dans les noms de fichiers . Pour imprimer la colonne n ° 2, ceci fonctionne:

COLUMNS=$COLUMNS ls -C | tr -s ' ' '\t' | cut -f2

Dérouler ça:

  • COLUMNS=$COLUMNSgarantit que la longueur de la colonne alimentée | reste cohérente avec l’affichage actuel du terminal. Changer cela en une valeur arbitraire fonctionne aussi, donc COLUMNS=50ou COLUMNS=70 aurait ls -Cpour effet de réorganiser les choses en fonction de ces largeurs.

    Une autre méthode consisterait à utiliser le -wcommutateur, par exemple :

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • trrend les séparateurs de champs cohérents: un seul onglet entre chaque colonne.

  • cut affiche la colonne souhaitée.

agc
la source
Méthode des
espaces en
-1
num_chars=54 # offset
ls -ltr | cut -c$num_chars-

changez le nombre de caractères (54) si nécessaire pour que vous n'obteniez que les données souhaitées.

m.rumore
la source
2
pour clarifier, en utilisant la 54-coupe dit à chaque caractère à partir de la position 54; ça ne s'arrête pas à la colonne "reconnue par l'homme"
Jeff Schaller
Ce n'est pas une mauvaise idée. Il faut simplement préciser.
Prusswan