J'essayais d'obtenir une liste de tous les fichiers python et html dans un répertoire avec la commande find Documents -name "*.{py,html}"
.
Puis vint la page de manuel:
Les accolades dans le modèle ('{}') ne sont pas considérées comme spéciales (c'est-à-dire que find. -Name 'foo {1,2}' correspond à un fichier nommé foo {1,2}, pas aux fichiers foo1 et foo2.
Comme cela fait partie d'une chaîne de tuyaux, j'aimerais pouvoir spécifier les extensions auxquelles il correspond au moment de l'exécution (pas de codage en dur). Si trouver ne peut tout simplement pas le faire, un Perl one-liner (ou similaire) serait bien.
Edit: La réponse que j'ai finalement trouvée inclut toutes sortes de conneries, et est un peu longue également, donc je l'ai postée en réponse à la démangeaison originale que j'essayais de gratter. N'hésitez pas à pirater cela si vous avez de meilleures solutions.
locate
, mais avec la mise en garde que la mise à jour interneb peut ne pas être à jour. Mais c'est rapide.Réponses:
Utilisation
-o
, ce qui signifie "ou":Vous auriez besoin de construire cette ligne de commande par programme, ce qui n'est pas si simple.
Utilisez-vous bash (ou Cygwin sous Windows)? Si vous l'êtes, vous devriez pouvoir faire ceci:
qui pourrait être plus facile à construire par programme.
la source
**
recherche récursive; Bash ne le prend en charge que dans les versions 4.0 et supérieures, et uniquement avecshopt -s globstar
.-name
s de supports, si vous utilisez-exec
. Par exemplefind Documents \( -name "*.py" -o -name "*.html" \) -exec file {} \;
-print0
pour gérer les noms de fichiers avec des espaces.Certaines éditions de find, principalement sur les systèmes linux, éventuellement sur d'autres prennent également en charge les options -regex et -regextype, qui trouvent des fichiers avec des noms correspondant à l'expression régulière.
par exemple
devrait faire l'affaire dans l'exemple ci-dessus. Cependant, ce n'est pas une fonction de recherche POSIX standard et dépend de l'implémentation.
la source
find . -regex ".*\.\(py\|html\)$"
cela fonctionne parce que trouver par défaut les expressions régulières de style Emacs, qui sont légèrement différentes, vous n'avez donc pas besoin de spécifier le regextype.-regextype posix-egrep
c'est pratique (sinon vous devrez échapper à beaucoup de caractères). Il s'agit de la commande find que j'ai utilisée pour créer un crochet de distribution en créant un zip de distribution Windows (trouve les fichiers à modifier et les modifie dans le fichier en dos-eol):find -regextype posix-egrep -regex ".*(\.([chyl]|def|cpy|cob|conf|cfg)|(README|ChangeLog|AUTHORS|ABOUT-NLS|NEWS|THANKS|TODO|COPYING.*))$" -exec sed -i -e 's/\r*$/\r/' {} \;
Vous pouvez ajouter par programme plus de
-name
clauses, séparées par-or
:Ou optez plutôt pour une boucle simple:
la source
*.py
fichiers ou vous avez une version bizarre defind
. La commande ci-dessus fonctionne très bien.-iname
. Il ne retourne les*.py
fichiers que s'il les écrit dans la dernière position (iname *.html
la première expression aussi) . J'utilise la commande sur Debian.Cela trouvera tous les fichiers .c ou .cpp sur linux
Vous n'avez pas besoin de la parenthèse d'échappement sauf si vous effectuez des mods supplémentaires. Ici, à partir de la page de manuel, ils disent si le motif correspond, imprimez-le. Peut-être essaient-ils de contrôler l'impression. Dans ce cas, le -print agit comme un conditionnel et devient un conditionnel "ET". Cela empêchera tout fichier .c d'être imprimé.
Mais si vous aimez la réponse originale, vous pouvez contrôler l'impression. Cela trouvera également tous les fichiers .c.
Un dernier exemple pour tous les fichiers source c / c ++
la source
J'avais un besoin similaire. Cela a fonctionné pour moi:
la source
()
find -name "*.cpp" -o -name "*.c" -o -name "*.cc" -print0
je devais utiliser une paire de parens regrouper le second ou opérateur.find -name "*.cpp" -o \( -name "*.c" -o -name "*.cc" \) -print0
Il se peut que -print0, qui est toujours "vrai", ait affecté la logique.Mon défaut a été:
find -type f | egrep -i "*.java|*.css|*.cs|*.sql"
Comme l'
find
exécution moins intensive du processus par Brendan Long et Stephan202 et al.:la source
egrep
regexp, plutôt, vous avez un glob de shell où une regexp doit être utilisée. (En outre, l'find
utilisation typique estfind {directory} [options...] [action]
:, où, selon impl,directory
peut être par défaut.
et paraction
défaut-print
, mais je serai explicite.) Donc, utilisez plutôt quelque chose comme:find . -type f -print | egrep -i '\.java$|\.css$|\.cs$|\.sql$'
Mais aussi, comme alternative très rapide àfind
, on pourrait aussi essayezlocate
d'une manière similaire (bien que pas nécessairement à jour, car il interroge une base de données interne pour une liste de fichiers)simple mais fonctionne :)
la source
J'avais besoin de supprimer tous les fichiers des répertoires enfants, à l'exception de certains fichiers. Les éléments suivants ont fonctionné pour moi (trois modèles spécifiés):
la source
Des accolades dans le modèle
\(\)
sont requises pour le modèle de nom avecor
Alors que pour le modèle de nom avec
and
opérateur, il n'est pas requisla source
Cela fonctionne sur le shell korn AIX.
Ceci recherche
*.cbl
ou*.dms
qui ont 1 jour, dans le répertoire actuel uniquement, en sautant les sous-répertoires.la source
la source
Qu'en est-il de
Il répertorie tous les fichiers se terminant par .py ou .html dans leurs noms de fichiers
la source