Comment lister les fichiers commençant par «a» ou «c» depuis / etc. [fermé]

10

J'ai essayé ls /etc/[ac]*mais il montre les répertoires commençant par a ou c , et tout leur contenu, pas les fichiers commençant par " a " ou " c ".

3df
la source
les répertoires sont l'un des nombreux types de fichiers . Quels types de fichiers vous intéressent (régulier, lien symbolique, périphérique, pipe, socket ...)?
Stéphane Chazelas
Il n'est pas clair si vous par "répertoire" parlez du contenu des répertoires ou des noms de répertoire eux-mêmes. La commande que vous montrez listerait le contenu des répertoires qui correspond au modèle, avec ls -d /etc/[ac]*vous n'obtiendriez pas le contenu des répertoires correspondants, mais verriez toujours les noms des répertoires. Il n'est pas clair si c'est ce que vous voulez ou si vous voulez éviter même de lister les noms de répertoire.
Kusalananda

Réponses:

23

Pour éviter de répertorier le contenu des répertoires, vous pouvez:

ls -d /etc/[ac]*

Cela listera les noms de répertoires ainsi que les noms de fichiers ordinaires commençant par aou c.

Pour être complet, une solution n'impliquant pas findpourrait être:

ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9
Greg Hewgill
la source
Ma lecture initiale de la question a également ls -dsemblé appropriée, mais il semble que la question d'origine spécifie qu'aucun répertoire ne devrait être répertorié, indépendamment de l'expansion ou de la non-expansion.
Chris Down
1
ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9ne pas analyser ls.
Avinash Raj
1
@AvinashRaj: Eh bien, la pertinence de ces conseils dépend de si l'on a besoin de cette solution pour fonctionner une fois ou pour toujours. Si seulement une fois, l'analyse lsest un jeu équitable à mon avis.
Greg Hewgill
3
Il a raison. Bien que les noms /etcsoient très probablement sains d'esprit, un simple espace rompra l' lsapproche puisque les numéros de champ changeront. +1 pour ls -ldcependant.
terdon
1
Vous devez également corriger les paramètres régionaux ( LC_ALL=C), la date n'est pas garantie d'avoir 3 champs dans d'autres paramètres régionaux.
Stéphane Chazelas
7

Récursivement:

find /etc -type f -name '[ac]*'

Si vous avez besoin de non-récursivité, vous pouvez le faire de manière portable:

find /etc/. ! -name . -prune -type f -name '[ac]*'

Ou ceci, de manière non portative (GNU ou une récente découverte BSD):

find /etc -type f -maxdepth 1 -name '[ac]*'

Si vous voulez faire ce cas de manière insensible, utilisez -inameau lieu de -name.

Chris Down
la source
1
Notez que -type fc'est pour les fichiers normaux . Si à la place vous avez besoin de fichiers non-répertoires, remplacez par ! -type d(ou ! -xtype davec GNU findsi vous souhaitez également exclure les liens symboliques vers les répertoires).
Stéphane Chazelas
1

Vous pouvez également essayer cette commande,

for file in /etc/[ac]*; do echo $file; done | xargs file | awk -v FS=" +" '$2~/directory/ {next;} {print $1}' | sed 's|\/etc\/||g;s/://g'
Avinash Raj
la source
1

Si vous voulez à la fois des répertoires (pas le contenu du répertoire) et des fichiers, vous pouvez utiliser printfbultin:

printf "%s\n" [ac]*

Exemple:

$ printf "%s\n" [te]*
examples.desktop
teamviewer_linux.deb
test.php
test.txt
cuonglm
la source
Comment cela évitera-t-il les répertoires, comme demandé dans la question?
Chris Down
Oh, ma mauvaise lecture. Je pense que OP veut un répertoire mais pas son contenu.
cuonglm
Désolé pour cette modification, complètement mal lu.
terdon
1

Non récursif sans find:

ls -pd /etc/[ac]* | grep -v '/$'

le -pajoute un /à la fin pour les répertoires, que le grepfiltre. Bien sûr, ne fonctionne pas pour les noms de fichiers qui contiennent des caractères spéciaux comme les sauts de ligne.

Anthon
la source
1

Avec zsh:

print -rl /etc/[ac]*(.)

Répertorierait les fichiers normaux (comme dans -type fdans find) répertoriés dans /etcdont le nom commence par aou c. La (xxx)partie à la fin d'un glob est une fonctionnalité spécifique à zsh appelée qualificatif globbing. .comme qualificatif globbing signifie fichier normal .

Si le glob ne correspond pas, zshabandonnera la commande. Notez que dans d'autres shells de type Bourne, si le glob ne correspond pas, le modèle se développe à lui-même, donc ls -d /etc/[ac]*pourrait incorrectement lister un fichier appelé /etc/[ac]*s'il n'y a pas de fichier commençant par aou cdans /etc.

print -rl /etc/[ac]*(^/)

répertorierait les fichiers qui ne sont pas de type répertoire et

print -rl /etc/[ac]*(-^/)

listerait les fichiers qui ne sont pas du type répertoire après la résolution des liens symboliques.

Stéphane Chazelas
la source
-3

Pour afficher les fichiers commençant par un:

ls etc |  grep ^a

Pour afficher les fichiers commençant par c:

ls etc |  grep ^c
Raj
la source