Est-il possible de renommer les répertoires de manière récursive sans utiliser sed ou rename?

J’essaie de renommer quelques répertoires contenant “Fever” pour qu’ils contiennent “Malaria”. L’instruction est de le faire sans sed ou renommer. Jusqu’à présent, mes erreurs incluent principalement des lignes comme

mv: cannot stat 'retest\nretest/Section-01\nretest/Section-02\nretest/Section-03\nretest/Section-04': No such file or directory .

Le meilleur de mon code est de renommer les répertoires du premier niveau.

Voici ma structure de répertoires:

Fever-A/Malaria-AA

Fever-B/Fever-BA

Fever-B/Fever-BB

Fever-C/Malaria-A

Fever-C/Fever-CA

Fever-C/Fever-CB

Fever-C/Fever-CCC

Fever-D/Malaria-A

Fever-D/Malaria-B

Le code que j’ai à ce jour est le suivant:

 #!/bin/bash # Access directory #cd $1 # Find all subdirectories in $1 and load up array all=($(find $1 -type d)) #echo ${all[@]} # Loop through directories above for dir in ${all[@]} do # echo "$dir" cd $dir # List files with "Section" in name subdir=(:"Section*") # A second loop for directories in each dir with "Section*" for item in ${subdir[@]} do echo $item echo "--------------------" # Rename operation mv $item ${item//Fever/Malaria} done cd $1 done 

Une autre approche que j’ai envisagée utilise une fonction comme celle-ci, mais elle ne fonctionne pas non plus: #! / Bin / bash

 rename(){ old_names=($(find $1 -maxdepth 1 -type d)) for item in ${old_names[@]} do if [[ $item = *Section* ]]; then new_name=${item//Fever/Malaria} mv $item $new_name elif [[ $1 != $item ]]; then rename $item fi rename $1 done } rename $1 

Le script ci-dessous fera ce que vous cherchez:

 #/bin/bash renamer(){ dirname="${1##*/}" dirname="${dirname//fever/malaria}" basedir="${1%/*}" mv "$1" "${basedir}/${dirname}" } export -f renamer find /path/to/start/search/from -depth -type d -name "*fever*" -exec bash -c 'renamer "$1"' _ {} \; 

Voir l’action

 $ tree . . |-- feverparent | |-- feverchild1 | | `-- feverish_child | | `-- totally_fever | `-- feverchild2 | `-- feverchild2_has_a_fever_child `-- myscript 6 directories, 1 file $ ./myscript $ tree . . |-- malariaparent | |-- malariachild1 | | `-- malariaish_child | | `-- totally_malaria | `-- malariachild2 | `-- malariachild2_has_a_malaria_child `-- myscript 6 directories, 1 file 

Remarques

  1. find manpage dit

    -depth Traite le contenu de chaque répertoire avant le répertoire lui-même.
    L’action -delete implique également -depth.

  2. Voir shell [extension de paramètre] pour comprendre ce qui se fait dans ma fonction.