2016-07-30 22 views
2

Ich versuche, einige Verzeichnisse umzubenennen, die "Fieber" enthalten, um "Malaria" stattdessen zu enthalten. Die Anweisung ist es ohne sed oder umzubenennen. Bis jetzt sind meine Fehler hauptsächlich Zeilen wieGibt es eine Möglichkeit, Verzeichnisse rekursiv umzubenennen, ohne sed oder umzubenennen?

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

Der beste Code, den ich gemacht habe, ist das Umbenennen von Verzeichnissen in der ersten Ebene.

Hier ist meine Verzeichnisstruktur:

Fever-A/Malaria-A-A

Fever-B/Fever-B-A

Fever-B/Fever-B-B

Fever-C/Malaria-A

Fever-C/Fever-C-A

Fever-C/Fever-C-B

Fever-C/Fever-C-C-C

Fever-D/Malaria-A

Fever-D/Malaria-B

Der Code, den ich bisher habe, ist:

#!/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 

Ein weiterer Ansatz, den ich in Betracht gezogen haben, eine Funktion verwendet, wie so aber es funktioniert auch nicht: #!/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 
+1

Begrenzen Sie Ihre 'find' Anweisung mit der Option' -name', z. 'find/path -type d -name" * Fever * "' Allgemein 'beim Lesen -r fname; Sachen machen...; done <<(find/Pfad -type d -name "* Fieber *") ' –

+0

Verwenden Sie Zitate ..... –

+0

@KarolyHorvath freundlicherweise illustrieren. Ich würde dich gerne besser verstehen. – SpaghettiThots

Antwort

2

Below Skript wird tun, was Sie suchen:

#/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"' _ {} \; 

es Siehe Aktion

$ 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 

Hinweise

  1. find manpage sagt

    -depth Prozess jeden Inhalt des Verzeichnisses vor dem Verzeichnis selbst.
    Die Aktion -delete bedeutet auch -depth.

  2. See Shell [ parameter expansion ] zu verstehen, was in meiner Funktion renamer getan wird.

+0

Keine bessere Möglichkeit es zu tun, denke ich;) ++ –