Se você está apenas procurando por uma versão mais compacta do seu loop for, você pode fazê-lo um pouco mais compacto da seguinte forma:
$ for dir in /home/*/tmp; do [ -d $dir ] && mv $dir ${dir/%tmp/temp/};done
Isso usará o recurso de globbing do bashes para encontrar todos os diretórios e arquivos que correspondam à expressão regular /home/*/tmp
. Em seguida, ele testa para ver se é um diretório ou não, se é um diretório, mova-o. O último bit ${dir/%tmp/temp/}
pesquisa e substitui o conteúdo da variável $dir
e substitui tmp
por temp
. Esta pesquisa & substituir é feito apenas uma vez da direita para a esquerda, protegendo assim qualquer coisa além do diretório tmp
.
Exemplo
Digamos que eu tenha essa estrutura de diretórios falsa:
$ tree -p
.
'-- [drwxrwxr-x] home
|-- [drwxrwxr-x] sam1
| '-- [drwxrwxr-x] tmp
|-- [drwxrwxr-x] sam2
| '-- [drwxrwxr-x] tmp
|-- [drwxrwxr-x] sam3
| '-- [drwxrwxr-x] tmp
'-- [drwxrwxr-x] sam4
'-- [-rw-rw-r--] tmp
Agora, se usarmos uma versão modificada do nosso comando acima, o que simplesmente ecoa o comando mv
em vez de executá-lo, podemos ver o que ele fará:
$ for dir in home/*/tmp; do [ -d $dir ] && echo "mv $dir ${dir/%tmp/temp/}";done
mv home/sam1/tmp home/sam1/temp/
mv home/sam2/tmp home/sam2/temp/
mv home/sam3/tmp home/sam3/temp/
OBSERVAÇÃO: O início /
está intencionalmente ausente, para que eu possa executar este teste a partir de um diretório de amostra que eu configurei.
renomeia em vez de mv
Você também pode solicitar a ajuda do comando rename
em vez de mv
. Isso muda o exemplo ligeiramente:
$ for dir in /home/*/tmp; do [ -d $dir ] && rename $dir ${dir/%tmp/temp/};done