Tente:
find . -maxdepth 2 -mindepth 2 -type d -execdir bash -c 'mv "$1" "./album_${1#./}"' mover {} \;
Notas:
-
Para formar o nome do diretório de destino, precisamos remover o
./
inicial que estará no nome do diretório. Para isso, usamos a remoção do prefixo do shell :${1#./}
. -
Usamos
-execdir
em vez de-exec
porque é mais robusto no caso de os diretórios serem renomeados enquanto o comando é executado. -
Na expressão
bash -c '...' mover {}
, bash executa o comando entre aspas simples com$0
atribuído amover
e$1
atribuído ao nome do arquivo,{}
.$0
não é usado, a menos que o shell precise gravar uma mensagem de erro. -
Não precisamos de nenhum recurso bash para esse código. Qualquer shell POSIX pode ser usado.
-
Se você quiser testar o comando antes de executá-lo para ter certeza de que deseja fazer o quê, adicione
echo
da seguinte forma:find . -maxdepth 2 -mindepth 2 -type d -execdir bash -c 'echo mv "$1" "./album_${1#./}"' mover {} \;
Notas sobre -exec mv '{}' album_'{}'
-
Não cite o
{}
.find
lida com isso. -
Como o nome do arquivo fornecido por
find
começará com./
, o formulárioalbum_{}
não será bem-sucedido.
Exemplo
Vamos considerar esses diretórios:
$ ls *
user1:
child1 child2
user2:
child1 child2
Press any key to continue...
Agora. vamos executar nosso comando e ver os novos nomes de diretório:
$ find . -maxdepth 2 -mindepth 2 -type d -execdir bash -c 'mv "$1" "./album_${1#./}"' mover {} \;
$ ls *
user1:
album_child1 album_child2
user2:
album_child1 album_child2