有没有办法递归重命名目录而不使用sed或重命名?

时间:2016-07-30 07:08:31

标签: bash unix recursion batch-rename

我正在尝试重命名包含“Fever”的几个目录来代替“Malaria”。该指令是在没有sed或重命名的情况下完成的。到目前为止,我的错误主要包括像

这样的行

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

我的代码所做的最好是重命名第一级目录。

这是我的目录结构:

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

我到目前为止的代码是:

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

我考虑的另一种方法是使用这样的函数,但它也不起作用:     #!/斌/庆典

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 个答案:

答案 0 :(得分:2)

以下脚本将执行您正在寻找的内容:

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

查看行动

$ 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

备注

  1. find manpage说

      

    -depth在目录本身之前处理每个目录的内容。   
    -delete动作也暗示-depth。

  2. 请参阅shell [ parameter expansion ]以了解我的函数renamer中正在执行的操作。