web-dev-qa-db-fra.com

Comment lister un type spécifique de fichiers dans des répertoires récursifs dans un shell?

Comment trouver des types de fichiers spécifiques, c’est-à-dire des fichiers pdf doc présents dans des répertoires imbriqués.

commande j'ai essayé:

$ ls -R | grep .doc

mais s'il y a un nom de fichier comme alok.doc.txt, la commande l'affichera aussi, ce qui n'est évidemment pas ce que je veux. Quelle commande devrais-je utiliser à la place?

35
Kumar Alok

Si vous êtes plus à l'aise avec "ls" et "grep", vous pouvez faire ce que vous voulez en utilisant une expression régulière dans la commande grep (le caractère de fin "$" indique que .doc doit être en fin de ligne. exclure "fichier.doc.txt"):

ls -R |grep "\.doc$"

Plus d'informations sur l'utilisation de grep avec des expressions régulières dans the man .

57
Benoit Courtine

La sortie de la commande ls est principalement destinée à la lecture par des humains. Pour les requêtes avancées de traitement automatisé, vous devez utiliser la commande find plus puissante:

find /path -type f \( -iname "*.doc" -o -iname "*.pdf" \) 

Comme si vous avez bash 4.0 ++

#!/bin/bash
shopt -s globstar
shopt -s nullglob
for file in **/*.{pdf,doc}
do
  echo "$file"
done
30
ghostdog74

Parmi les autres méthodes pouvant être utilisées:

echo *.{pdf,docx,jpeg}

stat -c %n * | grep 'pdf\|docx\|jpeg'

3

Nous avions une question similaire. Nous voulions une liste - avec des chemins - de tous les fichiers de configuration dans le répertoire etc. Cela a fonctionné:

find /etc -type f \( -iname "*.conf" \)

Cela donne une belle liste de tous les fichiers .conf avec leur chemin. La sortie ressemble à:

/etc/conf/server.conf

Mais nous voulions faire quelque chose avec TOUS ces fichiers, comme grep pour trouver un mot ou un paramètre dans tous les fichiers. Donc nous utilisons

find /etc -type f \( -iname "*.conf" \) -print0 | xargs -0 grep -Hi "ServerName"

pour trouver via grep TOUS les fichiers de configuration dans/etc qui contiennent un paramètre tel que "NomServeur"

/etc/conf/server.conf: ServerName "default-118_11_170_172"

J'espère que vous le trouverez utile.

Sid

2
find . | grep "\.doc$"

Cela montrera le chemin aussi.

1
Leo Bastin

De même, si vous préférez utiliser le caractère générique * (pas tout à fait comme les suggestions de regex), vous pouvez simplement utiliser ls avec l'indicateur -l pour répertorier un fichier par ligne (comme grep) et l'indicateur -R de la même façon. Ensuite, vous pouvez spécifier les fichiers que vous souhaitez rechercher avec *.doc I.E. Non plus

ls -l -R *.doc

ou si vous voulez qu'il liste les fichiers sur moins de lignes.

ls -R *.doc
0
Will C