web-dev-qa-db-fra.com

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

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, c'est faire écho uniquement à la deuxième colonne, dans ce cas, je veux faire écho:

file2
61
John

La commande suivante formatera la sortie ls dans une colonne

ls -1 /directory
87
ch0ps

Vous recherchez ceci:

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

Cependant, en supposant que vous allez essayer d'utiliser ce nom de fichier plus tard, ne le faites pas, car il se briserait sur les noms de fichiers contenant des espaces. Au lieu de cela, placez les fichiers dans un tableau et obtenez le second, ce qui évite d'avoir à effectuer une analyse 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 souhaiterez peut-être définir LC_COLLATE=C d'abord, si vous voulez un tri "standard" dans tous les cas d'angle.

40
Chris Down

Vous devez ajouter -C as ls utilise le mode à colonne unique lorsque la sortie n'est pas un terminal. awk imprime ensuite la deuxième colonne:

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

Je pense que vous cherchez

ls -1

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

3
Niti

Comme cela a déjà été mentionné - l'utilisation de colonnes pour analyser ls la sortie n'est pas très robuste car ls rompt les lignes en fonction de la longueur du nom de votre fichier et de la largeur du terminal. Il est cependant 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 -d vous permet de sélectionner le délimiteur de colonne, par exemple avec

cut -d, -f2

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

1
A Roebel

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

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

Parce que -all ajouter d'autres colonnes comme l'utilisateur, les autorisations, etc.

Supposons que si vous souhaitez afficher uniquement le nom de fichier particulier sous le chemin d'accès actuel, utilisez la commande ci-dessous

commander:

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

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

  1. longueur du nom de fichier (qui dépend elle-même de la liste de fichiers spécifiée transmise à ls -C)
  2. largeur du terminal.
  3. le fait que ls -C La sortie est en colonnes, mais peut être configurée sur un nombre variable d'espaces comme séparateurs de champs.
  4. la possibilité d'espaces dans les noms de fichiers (dont l'affichage dépend des options d'affichage ls choisies).

Pour l'instant, commençons par le problème le plus facile, ( ie pas # 4 ci-dessus), en supposant qu'il y a aucun espace dans les noms de fichiers. Pour imprimer la colonne # 2, cela fonctionne:

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

Dérouler cela:

  • COLUMNS=$COLUMNS garantit que la longueur de colonne fournie à | reste cohérent avec l'affichage actuel du terminal. Changer cela en une valeur arbitraire fonctionne aussi, donc COLUMNS=50 ou COLUMNS=70 causerait ls -C pour réorganiser les choses en fonction de ces largeurs.

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

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

  • cut affiche la colonne souhaitée.

0
agc