Au lieu de faire appel à des commandes externes, où vous perdez les informations sur le répertoire en cours, vous pouvez utiliser findl’ -execdiroption permettant à ce dernier d’exécuter des commandes dans le répertoire dans lequel un fichier a été trouvé.
find . -name oldfile.txt -execdir mv -- {} newfile.txt \;
C’est en fait une version plus sécurisée -execqui est préférée dans la plupart des situations. Le seul inconvénient est que ce n'est pas spécifié par POSIX, donc vous ne le trouverez pas dans toutes les findvariantes - mais au moins dans GNU findet BSD, findvous le pouvez.
Si vous voulez être plus sûr, vous devriez appeler mvcomme mv -- source targetsi un fichier commençant par un tiret n'était pas interprété incorrectement comme un argument mv.
Si, pour une raison quelconque, vous ne souhaitez pas utiliser -execdirou avoir d'autres tâches compliquées, ou si vous souhaitez simplement en apprendre un peu plus sur Bash, voici comment obtenir le dossier et déplacer le fichier en fonction de cela:
find . -name oldfile.txt -exec bash -c 'mv -- "${0}" "$(dirname $0)"/newfile.txt' {} \;
Ici, {}passe le chemin complet à bashas $0. Nous obtenons son nom de répertoire via commande substitution ( $(…)), puis ajoutons le nouveau nom. L'argument d'origine et le nom du répertoire doivent être cités deux fois pour empêcher les espaces de rompre la commande - sinon, mvon penserait que vous essayez de déplacer deux fichiers appelés fooet barlorsque le fichier est réellement appelé foo bar, par exemple.
mvest le répertoire? Je n'ai jamais vu mv avoir un troisième param. J'ai regardé le manuel mais cela ne semble pas clair.