Y at-il une forme plus simple de trouver. -name “* substring_of_filename *” sur Mac OS X et Linux?

4

Sur Mac OS X ou Linux, existe-t-il une forme plus simple de la commande

find . -name "*substring_of_filename*"

qui consiste à trouver tous les fichiers dont le nom contient des noms substring_of_filenamedans le répertoire courant (ou un autre répertoire donné). Parce que c'est une chose courante à faire, y a-t-il un moyen de rendre la commande plus courte et plus facile à taper, en utilisant éventuellement un alias ou une fonction dans Bash? Ou existe-t-il une autre commande facile à saisir qui peut être utilisée?

Tel que:

findfile . substring_of_filename

( Remarque: la question telle qu'elle a été écrite à l'origine utilisait app_config comme exemple de substring_of_filename.)

Arne Stenström
la source
2
locate app_config
Knittl
1
@knittl: Mais locaten'est pas limité au répertoire actuel et à ses sous-répertoires.
utilisateur inconnu

Réponses:

5

Sur Mac OS X, vous pouvez également mettre un alias en utilisant mdfind.bashrc:

# mdfind uses Spotlight 
alias findf='mdfind -onlyin . -name'

findf app_config
chad
la source
3

Voici votre fonction bash, mettez-la dans .bashrc:

function findfiles { find "$1" -iname "*$2*"; }

(Notez que -inamela recherche est insensible à la casse. Si vous ne le souhaitez pas, utilisez -nameplutôt.)

Janus Troelsen
la source
Vous pouvez également l'exécuter dans une session bash si vous souhaitez l'utiliser uniquement pour la session en cours.
Wuffers
inamen'est pas équivalent, nameest. Ce pourrait être votre utilisation préférée, mais ce n'était pas la question.
utilisateur inconnu
2

Au contraire! Il y en a une encore plus compliquée, mais une qui marche:

find . -name "*app_config*"

Le point n'est pas nécessaire pour gnu-find:

find -name "*app_config*"

Mais vous devez masquer les astérisques, sinon ils seront interprétés par le shell et vous ne trouverez que les noms de fichiers correspondant à ceux du répertoire en cours, qui correspondent à " app_config ".

Utilisateur inconnu
la source
semble pas vrai au moins sur Mac OS X
Qu'est-ce qui ne semble pas vrai? Que vous pouvez omettre le point? Ou qu'un fichier contenant «app_config» dans son nom et qui se trouve dans le répertoire actuel restreindra la recherche à son nom.
utilisateur inconnu
Je veux dire sur Mac OS X, vous pouvez utiliser find . -name *app_config*sans les guillemets
1
@BenU: Je n'ai pas de système avec Mac OS X, mais sous Linux, le besoin de guillemets provient du shell. Si je ne cite pas le "*", le shell essaie de le développer. Il n'est pas nécessaire pour la recherche, et non, si le * ne correspond pas à quelque chose dans le répertoire en cours, il est passé tel quel à rechercher. Vous pouvez essayer des guillemets simples, qui sont également autorisés dans bash, mais empêcheraient le développement de variables (ce qui n'est pas le cas ici ou parfois) -name "*.pdf.$id"par exemple.
utilisateur inconnu
1
Pour mémoire, les guillemets doivent être utilisés sous OS X de la même manière que sous Linux, car OS X dispose du même shell Bash que Linux.
Arne Stenström
1

Mettez ceci dans votre ~/.profileou ~/.bashrcnon, pas sûr lequel Mac utilise:

findname () 
{ 
    find . -name "*$1*"
}

puis appelez la fonction par findname name_of_file

Si vous voulez utiliser plusieurs mots, vous devrez être plus compliqué. La façon la plus simple de penser à moi est la suivante:

findname() 
{ 
    find .|grep $1|grep $2|grep $3|grep $4 
}

Cela trouvera tous les fichiers de votre répertoire actuel, recherchera la chaîne 1, puis le résultat pour la chaîne 2, etc., jusqu’à ce qu’il passe à 4.

Mat
la source
La deuxième fonction ne fonctionne que si les variables sont citées comme find . |grep "$1" |grep "$2" |grep "$3" |grep "$4". En outre, il recherche des parties du chemin plutôt que des parties de noms de fichiers.
Arne Stenström
0

Au lieu de faire cela dans un script bash, zsh, tcsh, sh, etc ..., j'ai créé un raccourci TextExpander . Je tape des types sh≤Space≥ et TE

trouver . -mon nom "**"

et place le curseur entre les astérisques.

Mark Thalman
la source
0

Sous OS X, pourquoi ne pas utiliser simplement localiser? Accordé, la localisation ne se met pas souvent à jour par défaut, mais vous pouvez la modifier facilement (modifiez la planification périodique des travaux sous OS X). Locate est un BSDism, je ne sais pas si c'est sous Linux ou non.

tamouse
la source
Dans certains scénarios, b est un risque de sécurité. Le répertoire de base chiffré par LUKS + la racine non chiffrée + updatedb indexant / home et stockant son cache quelque part dans / var (non chiffré) fuit les noms de fichiers de / home.
vtest
0

Sur la plupart des distributions Linux, vous pouvez utiliser la fonction de localisation. Par exemple:

$ locate find | grep bin
/sbin/findfs
/usr/bin/find
/usr/bin/find2perl
/usr/bin/findsmb
/usr/bin/gst-typefind-0.10
/usr/bin/memdiskfind
/usr/bin/oldfind
/usr/bin/sane-find-scanner
/usr/include/c++/4.5/ext/pb_ds/detail/bin_search_tree_/find_fn_imps.hpp
/usr/include/c++/4.5/ext/pb_ds/detail/binary_heap_/find_fn_imps.hpp
/usr/include/c++/4.5/ext/pb_ds/detail/binomial_heap_base_/find_fn_imps.hpp
Xenoactive
la source
0

Si vous utilisez bash 4 (avec shopt -s globstar) ou zsh:

prinftf %s\\n **/*substring_of_filename*
Lri
la source
0

La réponse est non". Il n’existe aucun raccourci pour "rechercher fichier par nom de fichier avec sous-chaîne dans le répertoire actuel ou inférieur" dans GNU find. Les alias que j'utilise pour contourner cette limitation sont les suivants (pour zsh):

# find file in cwd by [S]ubstring, case [I]nsensitive, change to first sub[D]irectory
finds()   { find .  -name "*$**"; }
findsi()  { find . -iname "*$**"; }
findsid() { cd `find . -iname "*$**" | head -n1 | xargs dirname`; }

Le dernier est mon préféré. Ceux-ci peuvent être utilisés comme suit:

> ls -R
.:
file1  File2  HOLEFILE  test

./test:
hello

(c'est le répertoire de test)

> findsi file
./HOLEFILE
./File2
./file1

> finds file
./file1

> finds le
./File2
./file1

> findsid ell
> ls
hello
Alex Hirzel
la source
Si quelqu'un les a dans le shell de leur choix, n'hésitez pas à éditer ce post et à ajouter votre version.
Alex Hirzel
-1

Je pense que juste grep peut le faire très bien, pas besoin de trouver. Options pertinentes de la page de manuel:

 -l, --files-with-matches
          Suppress  normal  output;  instead  print the name of each input
          file from which output would normally have  been  printed.   The
          scanning  will  stop  on  the  first match.  (-l is specified by
          POSIX.)

 -H, --with-filename
          Print  the  file  name for each match.  This is the default when
          there is more than one file to search.

 -R, -r, --recursive
          Read all  files  under  each  directory,  recursively;  this  is
          equivalent to the -d recurse option.

Notez que même si -H est la valeur par défaut lorsqu'il y a plus d'un fichier à rechercher, je vous suggère néanmoins de l'utiliser explicitement. Ce commutateur résout un problème particulier, il est préférable de garder à l'esprit cette connaissance directe- ment liée au cas de figure (recherche de plusieurs fichiers) lorsque cette option est la valeur par défaut.

La version grep de votre commande de recherche originale ressemblera à ceci:

grep -lHR app_config .
vtest
la source
2
Je soupçonne que "tous les fichiers contenant app_config" signifiait réellement "tous les fichiers ayant app_config dans leurs noms".
Eroen