GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Renommer un fichier au nom du répertoire parent dans le terminal ?

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.


Ubuntu
  1. Est-ce que Mv Atomic est sur le F?

  2. Renommer en masse le fichier Bash avec compteur ?

  3. Enregistrer toutes les sorties du terminal dans un fichier ?

  4. Comment renommer un fichier sous Linux ?

  5. Script shell Linux pour ajouter des zéros non significatifs aux noms de fichiers

Comment installer le gestionnaire de fichiers du terminal Ranger sur Linux

Comment créer un fichier sous Linux à l'aide de Terminal

Comment renommer des fichiers dans Ubuntu 20.04

Téléavertisseurs de terminaux

wget :nom du fichier téléchargé

Déplacer un fichier sous Linux en C