Outra resposta, usando o GNU find
para lidar com a renomeação. Esse método é robusto, independentemente de quais caracteres podem estar no nome do arquivo.
Se eu entendi o seu caso de uso corretamente, você deseja renomear os diretórios que começam com o nome completo do diretório pai. Em outras palavras, se o seu diretório é nomeado assim:
/some/path/abcdefghi/abcdefghi - something - else/
Você deseja renomeá-lo assim:
/some/path/abcdefghi/something - else/
Desde que você especifique o GNU como uma tag nesta questão, você pode usar as extensões GNU para o comando find
e lidar com isso da seguinte forma:
find . -mindepth 2 -maxdepth 2 -type d -regextype posix-egrep -regex '.*/([^/]+)/[^/]+' -exec sh -c 'new="$(sed -r "s:/([^/]+)/\1 ?-? ?([^/]+)\$:/\1/\2:" <<<$1)"; mv "$1" "$new"' find-sh {} \;
Resultados do teste:
[vagrant@localhost test]$ mkdir -p SLUG_1/SLUG_{1\ -\ SLUG_{2..4}\ -\ SLUG_5,7\ -\ something}
[vagrant@localhost test]$ find . -type d
.
./SLUG_1
./SLUG_1/SLUG_1 - SLUG_2 - SLUG_5
./SLUG_1/SLUG_1 - SLUG_4 - SLUG_5
./SLUG_1/SLUG_1 - SLUG_3 - SLUG_5
./SLUG_1/SLUG_7 - something
[vagrant@localhost test]$ find . -mindepth 2 -maxdepth 2 -type d -regextype posix-egrep -regex '.*/([^/]+)/[^/]+' -exec sh -c 'new="$(sed -r "s:/([^/]+)/\1 ?-? ?([^/]+)\$:/\1/\2:" <<<$1)"; mv "$1" "$new"' find-sh {} \;
[vagrant@localhost test]$ find . -type d
.
./SLUG_1
./SLUG_1/SLUG_3 - SLUG_5
./SLUG_1/SLUG_4 - SLUG_5
./SLUG_1/SLUG_2 - SLUG_5
./SLUG_1/SLUG_7 - something
[vagrant@localhost test]$