31 votes

Comment forcer l'affichage des chemins relatifs dans le résultat de la recherche ?

J'essaie de créer un script qui peut compresser des fichiers avec une certaine extension dans un certain nombre de répertoires en une seule boule de goudron. Actuellement, ce que j'ai dans le fichier script est :

find "$rootDir" -name '*doc' -exec tar rvf docs.tar {} \;

$rootDir est le chemin de base à rechercher.

Tout va bien, sauf que les chemins sont absolus dans le fichier tar. Je préférerais que les chemins soient relatifs à $rootDir . Comment dois-je m'y prendre ?

Exemple de courant tar -tf docs.tar$rootDir est /home/username/test de la production :

home/username/test/subdir/test.doc
home/username/test/second.doc

Ce que je souhaite que le résultat soit :

./subdir/test.doc
./second.doc

31voto

Gabriel Points 411

Vous pouvez utiliser le %P dans le format -printf directive :

find ${rootDir} -name '*.doc' -printf "%P\n"

s'affichera dans votre exemple :

subdir/test.doc
second.doc

Vous pouvez alors utiliser cette find dans une liste for afin d'exécuter notre commande exec, comme dans l'exemple suivant :

for f in $( find ${rootDir} -name '*.doc' -printf "%P\n" );
do
    tar rvf docs.tar ${f}
done

11voto

David Spillett Points 23094

Si vous exécutez find à partir du répertoire racine souhaité et ne pas spécifier de point de départ absolu dans la rubrique find il affichera les chemins relatifs vers le fichier tar les invocations de commandes qu'il construit. Par exemple :

cd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;

Si vous ne souhaitez pas modifier le répertoire de travail actuel de manière permanente et que vous utilisez la fonction bash ou similaire à votre Shell vous pourriez faire

pushd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;
popd

au lieu de cela.

Notez que pushd/popd ne sont pas présents dans tous les shells, vérifiez donc la page de manuel le cas échéant. Ils sont présents dans bash mais pas dans l'implémentation de base de sh, donc si l'on utilise explicitement /bin/bash vous pouvez compter sur eux, vous ne pouvez pas si un script demande une /bin/sh à la place (car cela peut correspondre à un Shell plus petit qui n'a pas les améliorations de bash)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X