web-dev-qa-db-fra.com

Comment sortir le nom de fichier dans la commande find en utilisant -exec?

J'utilise la ligne suivante pour trouver tous les sous-répertoires de la PWD et exécuter svnadmin verify sur chaque répertoire (je sais déjà qu'il s'agit de référentiels Subversion)

find ./* -maxdepth 0 -exec svnadmin verify {} \;

Cela fonctionne bien, à part le fait que la sortie ressemble à ceci:

* Verifying repository metadata ...
* Verifying metadata at revision 1 ...
* Verifying metadata at revision 2 ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 9 ...
* Verifying metadata at revision 10 ...
* Verifying metadata at revision 12 ...
* Verifying metadata at revision 14 ...
* Verifying metadata at revision 15 ...
* Verifying metadata at revision 18 ...
* Verifying metadata at revision 20 ...
* Verifying metadata at revision 22 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.
* Verified revision 10.
* Verified revision 11.
* Verified revision 12.
* Verified revision 13.
* Verified revision 14.
* Verified revision 15.
* Verified revision 16.
* Verified revision 17.
* Verified revision 18.
* Verified revision 19.
* Verified revision 20.
* Verified revision 21.
* Verified revision 22.
* Verified revision 23.
* Verified revision 0.
* Verifying repository metadata ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 7 ...
* Verifying metadata at revision 9 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.

J'aimerais vraiment que find imprime le nom du fichier avant d'exécuter la commande svnadmin verify afin de faciliter la journalisation.

J'ai essayé d'insérer un petit nom ls dedans, mais je l'ai fait, comment dois-je faire cela (de préférence simplement)?

31
Arronical

ajoutez simplement une option -printf avant

find -printf '%p' -exec command \;
34
Fiximan

Si vous ne voulez pas recurse, utiliser findne sert à rien. Il est beaucoup plus simple de le faire directement dans Shell:

for d in */; do echo "$d"; svnadmin verify "$d"; done

Le for d in */ trouvera tous les répertoires (le */ garantit que seuls les répertoires et aucun fichier ne sont trouvés); le echo "$d" imprimera le nom du répertoire; le svnadmin verify "$d" vérifiera le répertoire.

Cela peut être exécuté directement à partir de la ligne de commande ou à l'intérieur d'un script sans changement de format.

14
terdon
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

J'ai ajouté -type d s'il ne s'agit que de répertoires.

6
7171u

Essaye ça:

for f in * ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

Si vous ne voulez que des répertoires (Merci à @kos note):

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done
5
Maythux
  • Utilisez . -maxdepth 1 au lieu de ./*, vous n'avez besoin que du premier niveau de la structure de dossiers.
  • Utilisez -type d, vous n'avez besoin que de dossiers
  • Utilisez ! -name ".", vous n'avez pas besoin de .
  • Utilisez -exec pour démarrer un shell
  • Utilisez sh -c pour lancer des commandes dans le shell

Votre commande

find . -maxdepth 1 -type d ! -name "." -exec sh -c 'echo "{}"; svnadmin verify "{}"' \;

ou plus court

  • Utilisez -Prune si le fichier est un répertoire, n'y descendez pas

Votre commande

find . -mindepth 1 -Prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 
2
A.B.

find a des options pour l’impression, qui sont déjà mentionnées dans d’autres réponses. Si nous examinons le problème du point de vue de l’exécution de plusieurs commandes pour le même fichier en cours de traitement, find permet d’utiliser plusieurs instructions -exec. Cela signifie que nous pourrions choisir d'utiliser:

find ./* -maxdepth 0 -exec echo {} \; -exec svnadmin verify {} \; 

Encore une fois, notez que cette approche est applicable non seulement à l’impression avec echo, printf ou d’autres utilitaires, mais également à d’autres commandes.

1

Il peut être utile de diriger le résultat find vers la boucle read:

find . | while read d; do echo "=== ${d}: ==="; svnadmin verify ${d}; done

Il vous permet d'exécuter une séquence de commandes composée plus complexe avec les noms de fichiers renvoyés par find, comme dans cet exemple sophistiqué ls:

find . | while read f; do echo ${f} | figlet -k; done
0
Ves