我正在尝试将一些包含“发烧”的目录重命名为包含“疟疾”。该指令是在不使用 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
我考虑过的另一种方法是使用像这样的函数,但它也不起作用:
#!/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
正如 Don Crissti 提到的,有很多方法可以解决这个问题find
。但我认为,由于我们只讨论两个目录级别,因此我们可以仅使用一个外部命令以稍微不同的方式执行此操作:mv
#!/bin/bash
fixdir()
{
local f g
for f in Fever*
do
if [ -e "$f" ]
then
g=Malaria"${f#Fever}"
if [ -e "$g" ]
then
echo "Skipping $1/$f->$1/$g; already exists"
else
# echo "Renaming $1/$f->$1/$g"
mv "$f" "$g"
fi
fi
done
}
for a in *
do
if [ -d "$a" ]
then
(cd $a ; fixdir $a )
fi
done
fixdir .
结果:
$ ls -1d F*/*
Fever-A/Malaria-A-A
Fever-B/Fever-B-A
Fever-B/Fever-B-B
Fever-C/Fever-C-A
Fever-C/Fever-C-B
Fever-C/Fever-C-C-C
Fever-C/Malaria-A
Fever-D/Malaria-A
Fever-D/Malaria-B
$ ./fix
$ ls -1d M*/*
Malaria-A/Malaria-A-A
Malaria-B/Malaria-B-A
Malaria-B/Malaria-B-B
Malaria-C/Malaria-A
Malaria-C/Malaria-C-A
Malaria-C/Malaria-C-B
Malaria-C/Malaria-C-C-C
Malaria-D/Malaria-A
Malaria-D/Malaria-B
答案2
关于什么:
for dir in $(find /startdir -depth -type d -name '*Fever*')
do dn=$(basename $dir)
mv $dir $(dirname $dir)/${dn//Fever/Malaria}
done
应该可以做到这一点。 (将startdir更改为您的启动目录)
该查找将仅返回包含“Fever”的目录。 mv 命令使用 bash 内联替换返回一个字符串,其中 Fever 更改为 Malaria。
添加的 -depth 使其首先处理子目录。