ls: Ne pas afficher les directorys qui correspondent au même model dans les searchs generics, uniquement les files

En supposant que j'ai quelque chose comme ce qui suit, une situation PC d'affaires typique:

drwxr-xr-x 1 whatever whoever 3 Oct 3 16:40 invoices2009 drwxr-xr-x 1 whatever whoever 4 Oct 3 16:40 invoices2010 drwxr-xr-x 1 whatever whoever 2 Oct 3 16:40 invoices2011 -rwxr-xr-x 1 whatever whoever 440575 Oct 3 16:40 tax2010_1 -rwxr-xr-x 1 whatever whoever 461762 Oct 3 16:40 tax2010_2 -rwxr-xr-x 1 whatever whoever 609123 Oct 3 16:40 tax2010_3 

Maintenant, soyons paresseux et tapez:

 $ ls -l *2010* 

En supposant qu'il y a quelque chose dans le directory invoices2010, cela ne fonctionnera pas comme prévu. Puisque le nom du directory contient également l'année 2010 , ls également les files dans invoices2010 , bien que je ne veuille les listr que dans le directory courant. Encore plus drôle: imaginez que les files tax2010 * n'étaient pas du tout présents et qu'il n'y avait pas ces trois directorys comme dans l'exemple, mais 50 d'entre eux. Oui je l'ai essayé: ls n'indiquera même pas quels files sont dans quel directory, mais il suffit de les listr de haut en bas, comme si tous les files résidaient dans le directory actuel (sauf si vous spécifiez explicitement l'option -R , le sais)

De plus, je sais que je peux le faire aussi avec find , mais y a-t-il aussi un moyen d'accomplir cette tâche avec un one-liner simple (qui, évidemment, a une syntaxe beaucoup less compliquée)?

On dirait que votre question est "Comment listr les files par pattern en excluant les directorys avec ls uniquement".

Il n'y a aucun moyen de le faire avec des ls purs. Vous pouvez combiner ls + grep comme:

 ls -ld *2010* | grep -v '^d' 

Cependant, il est préférable d'utiliser find pour cela:

 find . -maxdepth 1 -type f -name "*2010*" 

Il n'est pas possible de filterr sélectivement les directorys en utilisant uniquement ls . Vous avez besoin de find ou ls | grep ls | grep , comme décrit dans la réponse de rush . Mais pour votre exemple spécifique, pour répondre à la question que vous avez posée dans votre commentaire :

Encore une fois: je veux que les files tax * du directory courant soient listés, mais le directory "invoices2010" qui se trouve dans le même directory de travail et qui correspond aussi au model générique 2010 doit être omis dans la list.

tu peux faire

 ls -l --ignore='invoices*' *tax2010* 

qui filter tout ce qui correspond au model de shell ignore .

Utilisez zsh …

 ls -l *2012*(.) 

Le qualificatif glob . signifie des files normaux uniquement.

ls -dlp *2010* serait un bon début pour la solution, mais cela dépend de ce que vous voulez que la sortie ressemble.

N'utilisez pas grep avec ls,

Dans bash, vous pouvez afficher les files qui ont un "2010" dans son nom mais pas regarder avec un nombre:

ls -l *[!0-9]2010*

Il y a des raisons pour ne pas grep contre ls mais si vous ne les tenez pas count, cela fonctionne. Utilisez la command ls tant que tableau d'input, appelez ls -ld sur chaque input ls -ld vers grep pour exclure les directorys avec la sortie envoyée à null, et en cas d'écho avec l'input d'origine:

 for list in `ls` ; do ls -ld $list | grep -v ^d > /dev/null && echo $list ; done ; 

Vous pouvez inverser le grep et la sortie conditionnelle, les mêmes résultats:

 for list in `ls` ; do ls -ld $list | grep ^d > /dev/null || echo $list ; done ; 

EDIT: Mon mauvais, cela fonctionne sans une correspondance de model, mais si vous ajoutez une search générique comme dans l'OP ci-dessus, et que vous avez un directory qui correspond au model, la sortie inclut toujours les messages du système. juste la list des files.

EDIT à nouveau: correction des antislash sur / dev / null.