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

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

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.


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}'

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.


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.


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.


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"

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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.