Как упоминает Дон Криссти, существует множество способов решения этой проблемы с помощью 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