2016-07-30 35 views
2

我想重命名包含“发烧”的几个目录来包含“疟疾”,而不是。该指令是在没有sed或重命名的情况下执行的。到目前为止,我的错误主要包括像有没有方法递归重命名目录而不使用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

用'-name'选项限制你的'find'语句,例如, 'find/path -type d -name“* Fever *”'一般'while read -r fname;做东西...;完成<<找到/路径类型D - 名称“*发烧*”)' –

+0

使用引号..... –

+0

@KarolyHorvath善意说明。我很想更好地理解你。 – SpaghettiThots

回答

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手册页说

    - 深度处理目录本身之前,每个目录的内容。
    -delete动作也意味着-depth。

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

+0

没有更好的方法来做到这一点,我猜;)++ –