Comment rechercher uniquement des fichiers dans un répertoire donné et ignorer les sous-répertoires à l'aide de bash


130

J'ai regardé d'autres questions similaires, mais je n'en ai pas trouvé une qui me permettrait de saisir le concept et de le rendre applicable à ma situation en fonction de mon temps limité. J'exécute simplement la commande find pour trouver certains fichiers, mais certains fichiers dans les sous-répertoires ont le même nom que je veux ignorer. Merci pour toute aide. Voici la commande que j'utilise:

Les fichiers / modèles qui m'intéressent: / dev / abc-scanner, / dev / abc-cash ....

La commande:

find /dev/ -name 'abc-*'

Ce qui est retourné:

/dev/abc-scanner
/dev/abc-cash
...
...
...
/dev/.udev/names/abc-scanner
/dev/.udev/names/abc-cash

Je veux ignorer ces derniers fichiers: /dev/.udev / ...


9
ignorer des sous-répertoires spécifiques, ou ne pas descendre dans des sous-répertoires? Pour ce dernier, utilisez l'option -maxdepth 1
frankc

@frankc Postez-le comme réponse.
cnicutar du

Réponses:


203

Si vous souhaitez simplement limiter la recherche au premier niveau, vous pouvez faire:

 find /dev -maxdepth 1 -name 'abc-*'

... ou si vous souhaitez particulièrement exclure le .udevrépertoire, vous pouvez faire:

 find /dev -name '.udev' -prune -o -name 'abc-*' -print

Si je voulais lister où tous les liens symboliques ci-dessus pointés se trouvent dans le modèle ci-dessus, est-ce que j'utiliserais simplement un tube? Quelque chose comme find / dev -maxdepth 1 -name 'abc- *' | ls -l
suffa

1
Il est préférable d'utiliser à la xargsplace, donc quelque chose comme: find /dev -maxdepth 1 -name 'abc-*' | xargs ls -lmais s'il y a une chance qu'ils aient des espaces dans les noms, vous devriez le fairefind /dev -maxdepth 1 -name 'abc-*' -print0 | xargs -0 ls -l
Mark Longair

Cependant, comme le souligne la réponse de Stephen Darlington , je ne sais pas pourquoi vous ne le feriez pas simplementls -l /dev/abc-*
Mark Longair

De plus, si vous voulez savoir où pointent les liens symboliques, vous pouvez le fairefor x in /dev/abc-*; do readlink -f $x; done
Mark Longair

1
Ou si vous voulez des sous-répertoires uniquement au premier niveau, ls -l /dev/abc-* /dev/*/abc-* | fgrep -v /dev/.udev... sauf au moins sur mon Linux /dev/*/*n'inclut pas les fichiers /dev/.udev/*, vous pouvez donc omettre le fichier fgrep -v.
tripleee

9

Y a-t-il une raison particulière que vous devez utiliser find? Vous pouvez simplement utiliser lspour trouver des fichiers qui correspondent à un modèle dans un répertoire.

ls /dev/abc-*

Si vous avez besoin d'utiliser find, vous pouvez utiliser le -maxdepth 1commutateur pour appliquer uniquement au répertoire spécifié.


Je pense que vous voulez dire -maxdepth 1plutôt que-maxdepth 0
Mark Longair

5
Il convient de souligner que le joker est la partie importante ici, non ls. Vous pouvez trouver les mêmes fichiers avec echoou wcou tout ce que vous avez, car le shell développe le caractère générique pour vous. C'est for file in /dev/abc-*; do something with each "$file"; donepeut-être ce que le PO recherche réellement.
tripleee

1
Ah, je ne me souviens jamais de quel côté il s'agit ... Merci pour la modification. En outre, il convient de noter que ce n'est pas universel. La version Solaris de findne l'a pas par exemple.
Stephen Darlington

@tripleee +1. Ouaip. Tout faire dans le shell serait préférable si possible.
Stephen Darlington

1
@MustafaOzturk Le lsest superflu. for f in abc*; ...est tout ce dont vous avez besoin.
Stephen Darlington

4

Cela peut faire ce que vous voulez:

find /dev \( ! -name /dev -prune \) -type f -print

2
Oui, cela fonctionne. -maxdepth n'est pas implémenté dans find sur certains anciens Unix.
CCTO

-1
find /dev -maxdepth 1 -name 'abc-*'

Ça ne marche pas pour moi. Il ne renvoie rien. Si je fais juste '.' il me donne tous les fichiers dans le répertoire sous celui sur lequel je travaille.

find /dev -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls

Ne rien renvoyer avec '.' à la place, j'obtiens la liste de tous les «gros» fichiers dans mon répertoire ainsi que le répertoire rootfiles / où je stocke les anciens.

Continuer. Cela marche.

find ./ -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls
564751   71 -rw-r--r--   1 snyder   bfactory   115739 May 21 12:39 ./R24eTightPiPi771052-55.root
565197  105 -rw-r--r--   1 snyder   bfactory   150719 May 21 14:27 ./R24eTightPiPi771106-2.root
565023   94 -rw-r--r--   1 snyder   bfactory   134180 May 21 12:59 ./R24eTightPiPi77999-109.root
719678   82 -rw-r--r--   1 snyder   bfactory   121149 May 21 12:42 ./R24eTightPiPi771098-10.root
564029  140 -rw-r--r--   1 snyder   bfactory   170181 May 21 14:14 ./combo77v.root

Apparemment, cela /dev signifie un répertoire d'intérêt. Mais ./est nécessaire, pas seulement .. Le besoin de l ' /n'était pas évident même après avoir compris ce que /devsignifiait plus ou moins.

Je n'ai pas pu répondre en commentaire car je n'ai pas de «réputation».


1
Vous gagnez en réputation en donnant de bonnes réponses. Veuillez lire ce stackoverflow.com/conduct
aifrim

Il y a des raisons pour lesquelles vous n'êtes pas autorisé à commenter et cela ne vous donne pas la permission de mettre des commentaires ici dans la section Réponse. Veuillez supprimer ceci.
Rob
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.