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
La commande suivante formatera la sortie ls dans une colonne
ls -1 /directory
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.
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}'
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.
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.
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"
C'est délicat, car l'analyse de ls -C
dépend de:
ls -C
)ls -C
La sortie est en colonnes, mais peut être configurée sur un nombre variable d'espaces comme séparateurs de champs.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.