Je dois gérer un grand nombre de fichiers imbriqués dans des répertoires (un fichier par répertoire), ressemblant à quelque chose comme ceci :
fred/result.txt
john/result.txt
mary/result.txt
...
J'utilise actuellement la commande suivante pour traiter chacun de ces fichiers :
find . -maxdepth 1 -type d ( ! -name . ) -exec bash -c "cd '{}' && processResult result.txt" ;
Je cherche quelque chose que je peux ajouter à la fin de cette commande qui changera les noms de fichiers en fred.txt
, etc., puis déplacez ultérieurement le fichier dans le répertoire parent pour éliminer la couche supplémentaire de répertoires.
Quelle serait la meilleure façon de procéder ?
Réponse acceptée :
On peut utiliser l'approche classique :find
avec while read
combo :
Démo :
$ ls *
fred:
results.txt
jane:
results.txt
john:
results.txt
$> find . -type f -name "results.txt" -printf "/%Pn" | while read FILE ; do DIR=$(dirname "$FILE" );
> mv ."$FILE" ."$DIR""$DIR".txt;done
$> ls
fred/ jane/ john/
$> ls *
fred:
fred.txt
jane:
jane.txt
john:
john.txt
Utiliser echo
avant d'utiliser mv
pour tester la ligne avec vos fichiers.
Amélioration mineure
Nous pouvons intégrer l'appel à bash
dans exec , avec l'expansion des paramètres (en particulier la suppression du préfixe). Fondamentalement, il s'agit d'intégrer un script dans l'appel exec.
$> find "$PWD" -type f -name "results.txt" -exec bash -c ' DIR=$( dirname "{}" ); echo "{}" "$DIR"/"${DIR##*/}".txt ' ;
/home/xieerqi/TESTDIR/fred/results.txt /home/xieerqi/TESTDIR/fred/fred.txt
/home/xieerqi/TESTDIR/jane/results.txt /home/xieerqi/TESTDIR/jane/jane.txt
/home/xieerqi/TESTDIR/john/results.txt /home/xieerqi/TESTDIR/john/john.txt
Pour rendre la commande générale (fonctionnant pour n'importe quel fichier, pas seulement results.txt
) supprimez simplement -name "results.txt"
partie. Voir également cet article pour une solution Python alternative à cela.