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
find
manpage dit
-depth Traite le contenu de chaque répertoire avant le répertoire lui-même.
L’action -delete implique également -depth.
Voir shell [extension de paramètre] pour comprendre ce qui se fait dans ma fonction.