2011-05-09 3 views
3

Je suis en train de lister tous les fichiers que nous avons reçus en un moisretours grep « Un trop grand nombre d'argument spécifié sur commande »

Le modèle de nom de fichier sera

20110101000000.txt 

YYYYMMDDHHIISS.txt 

Le répertoire entier est d'avoir des millions de fichiers. Pendant un mois, il peut y avoir un minimum de 50000 fichiers. L'idée du sous-répertoire est toujours en attente. Y at-il un moyen de lister un grand nombre de fichiers avec un nom de fichier presque similaire.

grep -l 20110101*  

J'essaie cela et renvoyer l'erreur. J'essaye php cela a pris énormément de temps, c'est pourquoi j'utilise un script shell. Je ne comprends pas pourquoi la coquille ne donne pas non plus un résultat Toute suggestion s'il vous plaît !!

+0

Cette question posée en 2011 est le double de la question posée en 2012 !!! – zod

+0

En relation: [Est-ce que "la liste d'arguments est trop longue" s'applique aux interpréteurs de commandes shell?] (Https://stackoverflow.com/questions/47443380/does-argument-list-too-long-restriction-apply-to-shell-builtins) – codeforester

Répondre

5
$ find ./ -name '20110101*' -print0 -type f | xargs -0 grep -l "search_pattern" 

vous pouvez utiliser find et xargs. xargs exécutera grep pour chaque fichier trouvé par find. Vous pouvez utiliser -P pour exécuter plusieurs grep parallèlement et -n pour plusieurs fichiers par appel de commande grep. L'argument print0 dans find sépare chaque nom de fichier avec un caractère nul pour éviter toute confusion causée par des espaces dans le nom du fichier. Si vous êtes sûr qu'il n'y aura pas d'espace, vous pouvez supprimer les arguments -print0 et -0.

+0

Merci. Je veux que le "trouver" retourne seulement le nom de fichier. maintenant il retourne ./filename. J'essaie d'utiliser juste. mais aussi c'est pas – zod

+0

Evitez les xargs inutiles. Une solution de recherche uniquement serait plus simple et légèrement plus rapide. – jlliagre

0

vous avez besoin de mettre un terme de recherche, alors

grep -l "search term" 20110101* 

si vous voulez trouver simplement les fichiers, utilisez ls 20110101*

0

Juste redirigez la sortie de ls grep:

ls | grep '^20110101'

+0

Merci comment puis-je mettre un terme de recherche à cela? – zod

+0

@zod: Votre question semble indiquer que vous voulez juste une liste de tous les fichiers dans le répertoire dont les noms commencent par "20110101", ce que fait ce code; il utilise "'^20110101' "comme motif à rechercher dans la sortie de' ls'. – jwodder

1

Le 20.110.101 * est augmenté de se shell avant d'être passé à la commande, si vous obtenez un argument passé pour chaque fichier dans le répertoire qui commence par 20110101.

Si vous voulez juste une liste de les fichiers correspondants, vous pouvez utiliser trouver:

find . -name "20110101*" 

(notez que cela recherche chaque sous-répertoire aussi)

2

cela devrait être la façon plus rapide:

find . -name "20110101*" -exec grep -l "search_pattern" {} +

Si vous voulez éviter le point principal:

find . -name "20110101*" -exec grep -l "search_pattern" {} + | sed 's/^.\///'

ou mieux grâce à adl:

find . -name "20110101*" -exec grep -l "search_pattern" {} + | cut -c3-

+1

'| couper -c3-'est aussi un moyen simple de supprimer les deux premiers caractères de chaque ligne. – adl

+0

En effet, et plus vite aussi. – jlliagre

1

Certaines des informations détaillées disponibles here et aussi un autre TRAVAIL DE autour de: for FILE in 20110101*; do grep foo ${FILE}; done. La plupart des gens iront avec xargs et des administrateurs plus expérimentés avec -exec {} + qui accomplit exactement la même chose, sauf qu'il est plus court à taper. On utiliserait le shell inline pour construire, quand exécuter plus de processus est moins important que de voir les résultats. Avec la construction de for, vous pouvez exécuter des milliers de fois grep, mais vous voyez chaque match en temps réel, tout en utilisant find et/ou xargs vous voyez des résultats par lots, mais grep est beaucoup moins exécuté.

Questions connexes