9
votes

Bash Scripting: Trouver tous les fichiers de fichiers et chemins

Utilisation de bash, comment pouvez-vous parcourir des dossiers dans un dossier spécifié, trouver tous les fichiers de type de fichier spécifié et chaque fois que vous trouverez un fichier, obtenez le chemin de fichier complet avec le nom de fichier et le chemin de fichier complet sans nom de fichier en tant que variables et passe à un autre script Bash, exécutez-le et continuez à chercher le fichier suivant?


1 commentaires

À UNIX, il n'y a pas de «fichiers files». Si vous le souhaitez, vous pouvez mettre des contrats mnémoniques dans le nom, comme ".txt", ".xml", ".unicode"; Mais cela ne fait qu'une partie du nom et uniquement pour le bénéfice de l'utilisateur.


5 Réponses :


0
votes

ressemble beaucoup à des devoirs.

find /path -type f -name "*.ext" -printf "%p:%h\n" | while IFS=: read a b
do
   # execute your bash script here
done


6 commentaires

Cela ne semble pas tout à fait raison ... si % p:% h n'a pas d'espaces, Lecture AB mettra tout dans A et rien dans B , sauf si vous définissez ifs =: .


décidé d'utiliser: puisqu'il peut y avoir des fichiers avec des espaces


Il peut aussi facilement être des fichiers avec des cocons. J'utiliserais '% p \ n% h \ n' et lire a && lire b , mais qui échoue toujours s'il y a des noms de fichiers avec des nouvelles lignes intégrées.


Wow, alors il peut y avoir de nombreuses possibilités de noms de fichiers avec des caractères spéciaux, de la façon dont vous le dites. :)


Dans UNIX, toute séquence d'octets (éventuellement avec une restriction de longueur) ne contenant pas de nul ("\ 0") ou '/' est acceptable pour un nom de fichier, même s'ils ne sont pas des caractères imprimables.


Méfiez-vous des caractères d'échappement. Utilisez Trouver -print0 avec Xargs -0. Voir ma réponse plus précise ...



18
votes

supposer un GNU Trouver (ce qui n'est pas déraisonnable) Vous pouvez Faites cela en utilisant simplement:

find /path -type f -name '*.ext' -exec my_cool_script \{\} \;


5 commentaires

Quel est le but de \ {\} là-bas? Tout avantage sur {} ou '{}'?


C'est un peu de sécurité supplémentaire contre la coquille. La page manuelle pour trouver des états: "Ces deux constructions devraient être échappées (avec un" \ ') ou citée pour les protéger de l'expansion par la coquille ".


Le problème avec c'est que la recherche avec EXED ne gère pas correctement la liste longue liste de fichiers. J'ai quelque chose comme "la ligne trop longue". Voir ma réponse détaillée ...


@neuro: vraiment? -exec; s'exécute un à la fois, et si cette ligne de commande est trop longue, vous êtes assez vissé avec (code> ou xargs . Maintenant, GNU Westerutils a eu des bogues -exec + dans le passé, mais ils doivent être résolus maintenant et la différence entre trouver -exec + contre trouver -print0 | Xargs -0 est assez minime.


@Efement: Eh bien, j'ai eu ce genre d'erreurs dans le passé, j'ai donc utilisé Xargs depuis. Je frappe probablement un bug à l'époque. J'utilisais -exec mais j'ai constaté que l'utilisation de Xargs est plus lisible que -exec et les séquences d'échappement. Le -print0 | Xargs -0 est un moyen magique de gérer les espaces dans des noms, en particulier lorsque vous utilisez votre script dans un environnement Windows / Mingw / Cygwin ...



5
votes

trouver est la voie. Utiliser Xargs Manipulez une longue liste de fichiers / DIRS. De plus, pour traiter les noms correctement avec des espaces et un problème comme celui-là, la meilleure commande de la ligne de recherche que j'ai trouvée est la suivante: xxx

Le truc est la trouvaille -print0 qui est compatible avec le XARGS -0: Il remplace les lignes d'endurance par '\ 0' pour gérer correctement les espaces et les caractères d'échappement. L'utilisation de Xargs vous évacuez un message "ligne trop long" lorsque votre fichier de filiste est trop long.

Vous pouvez utiliser Xargs avec --NO-RUN-IF-vide pour gérer les listes vides et le lieu de gérer complexe commandes.


0 commentaires


-1
votes

Comme certains ont déjà mentionné, Linux / Unix n'a aucune extension de fichier obligatoire. Toutefois, sur des systèmes basés sur UNIX, le type de nombreux fichiers couramment rencontrés peut être déterminé par la commande de fichier. L'exemple suivant utilise la commande de fichier pour transmettre le nom et le type ou chaque fichier sur my_script: xxx pré>

la commande xargs a été utilisé pour minimiser le nombre d'exécutions de la commande de fichier. P >

Les informations de type seront assez étendues, comme on peut le voir dans l'exemple de sortie suivant de l'étape de fichier Xargs: p> xxx pré>

Les autres exigences autour de l'extraction du chemin de la route Le nom de fichier pourrait être fait à l'intérieur de My_script ou s'il doit être fait avant My_script, à l'aide de l'extraction de chaîne Bash ou de SED / AWK / PERL pour reformater la sortie. P>

Si vous attendez des noms de fichiers avec des espaces ou d'autres Caractères spéciaux en eux, alors comme suggéré dans les réponses précédentes, vous pouvez utiliser -Print0: P>

    find /path -type f -print0 | xargs -0 file | while read -r line ; do my_script "$line"; done


0 commentaires