web-dev-qa-db-fra.com

Rechercher un fichier dans le répertoire à partir de la ligne de commande

Dans les éditeurs/ides tels que Eclipse et textmate, il existe des raccourcis pour rechercher rapidement un fichier particulier dans un répertoire de projet.

Existe-t-il un outil similaire pour compléter le chemin complet des noms de fichiers dans un répertoire (récursivement), en bash ou dans un autre shell?

J'ai des projets avec beaucoup de répertoires, et des répertoires plus profonds (soupir, Java) . Frapper l'onglet dans le shell ne parcourt que les fichiers du répertoire immédiat, cela ne suffit pas = /

40
whoisbenli
find /root/directory/to/search -name 'filename.*'
# Directory is optional (defaults to cwd)

La lecture standard UNIX est prise en charge. Voir man find pour plus d'informations.

Si vous utilisez Vim, vous pouvez utiliser:

:e **/filename.cpp

Ou :tabn ou toute commande Vim qui accepte un nom de fichier.

61
strager

Si vous cherchez à créer quelque chose avec une liste de fichiers, vous pouvez utiliser la combinaison find avec la construction bash $() (mieux que les backticks puisqu’il est autorisé à imbriquer).

par exemple, disons que vous êtes au niveau supérieur du répertoire de votre projet et que vous voulez une liste de tous les fichiers C commençant par "btree". La commande:

find . -type f -name 'btree*.c'

retournera une liste d'entre eux. Mais cela n’aide pas vraiment à faire quelque chose avec eux.

Supposons donc que vous souhaitiez rechercher dans tous ces fichiers la chaîne "ERREUR" ou les éditer tous. Vous pouvez exécuter l'un des:

grep ERROR $(find . -type f -name 'btree*.c')
vi $(find . -type f -name 'btree*.c')

pour faire ça.

8
paxdiablo

Quand j'étais dans le monde UNIX (avec tcsh (soupir ...)), j'avais toutes sortes de configurations de "trouver" alias/scripts pour la recherche de fichiers. Je pense que la syntaxe par défaut de "recherche" est un peu maladroite. J'avais donc l'habitude d'utiliser des alias/scripts pour diriger "recherche. -Print" dans grep, ce qui vous permet d'utiliser des expressions régulières pour la recherche:

# finds all .Java files starting in current directory
find . -print | grep '\.Java'

#finds all .Java files whose name contains "Message"
find . -print | grep '.*Message.*\.Java'

Bien entendu, les exemples ci-dessus peuvent être réalisés à l'aide de find-old plaine, mais si vous avez une recherche plus spécifique, grep peut vous aider. Cela fonctionne plutôt bien, à moins que "find. -Print" ne contienne trop de répertoires pour être consultés ... alors cela devient assez lent. (par exemple, vous ne voudriez pas faire cela en commençant par la racine "/")

2
Andy White

J'utilise ce script pour trouver rapidement des fichiers sur plusieurs répertoires d’un projet. J'ai trouvé que cela fonctionne très bien et tire parti de la saisie semi-automatique de Vim en ouvrant et en fermant un nouveau tampon pour la recherche. Il complète également intelligemment le plus possible pour vous. Vous pouvez donc taper un ou deux caractères et ouvrir le fichier dans n’importe quel répertoire de votre projet. J'ai commencé à l'utiliser spécifiquement à cause d'un projet Java et cela m'a fait gagner beaucoup de temps. Vous venez de construire le cache une fois lorsque vous démarrez votre session d’édition en tapant: FC (noms de répertoire). Vous pouvez aussi simplement utiliser. pour obtenir le répertoire actuel et tous les sous-répertoires. Après cela, il vous suffit de taper: FF (ou FS pour ouvrir une nouvelle division) et cela ouvrira une nouvelle mémoire tampon pour sélectionner le fichier souhaité. Une fois que vous avez sélectionné le fichier, le tampon temporaire se ferme et vous vous trouvez dans le fichier demandé et vous pouvez commencer l’édition. En outre, ici est un autre lien sur Stack Overflow qui peut aider.

1
SnapShot

http://content.hccfl.edu/pollock/Unix/FindCmd.htm

La commande "trouver" de linux/unix.

0
Stefan Kendall

Oui, bash a des mécanismes d’achèvement du nom de fichier. Je ne les utilise pas moi-même (trop paresseux pour apprendre et je ne trouve pas nécessaire de le rendre urgent), mais le mécanisme de base consiste à taper les premiers caractères, puis une tabulation; cela étendra le nom autant que possible (peut-être même pas du tout) tant que le nom est sans ambiguïté. Il y a un chargement complet de commandes de style Emacs liées à la complétion dans la page de manuel good ol '.

0
Jonathan Leffler

locate <file_pattern>

*** find fonctionnera certainement et pourra cibler des répertoires spécifiques. Cependant, cette commande est plus lente que la commande locate. Sur un système d’exploitation Linux, chaque matin, une base de données contenant une liste de tous les fichiers et répertoires est construite. La commande locate effectue une recherche efficace dans cette base de données. Par conséquent, si vous souhaitez rechercher des fichiers qui n’ont pas été créés aujourd le moyen le plus rapide d'accomplir une telle tâche.

0
Marquistador