我正在尝试重命名包含“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
答案 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
备注强>
find
manpage说
-depth在目录本身之前处理每个目录的内容。
-delete动作也暗示-depth。
请参阅shell [ parameter expansion ]以了解我的函数renamer
中正在执行的操作。