find . -depth -type d -name doc -exec sh -c 'mv "${0}" "${0%/doc}/Doc"' {} \;
Eu quero encontrar todos os diretórios com o último subdiretório chamado doc , para depois renomeá-los para Doc . Como pode ser renomeado?
Eu tenho a primeira parte:
find -type d -name 'doc'
que retorna caminhos de diretórios como:
./foo/bar/doc
No zsh, você pode usar a zmv
function para gerar massa arquivos -rename:
zmv '(**/)doc' '${1}Doc'
Se você possui não diretórios chamados doc
, certifique-se de não combiná-los, adicionando um Qualificador glob :
zmv -Q '(**/)doc(/)' '${1}Doc'
Se sua intenção é capitalizar o diretório e você estiver usando bash
4+, isso deve ser feito:
find . -type d -name doc -print0 \
| while read -rd $'find . -type d -name doc -print0 \
| while read -rd $'%pre%' file; do
dname=$(dirname "$file")
fname=$(basename "$file")
mv "$file" "$dname"/"${fname^}"
done
' file; do
dname=$(dirname "$file")
fname=$(basename "$file")
mv "$file" "$dname"/"${fname^}"
done
Observe o uso de
para garantir o manuseio correto de nomes de arquivos incomuns. ${var^}
Como jw013 aponta nos comentários ^
não funciona como eu esperava. Eu alterei a resposta para separar o caminho no diretório e nome do arquivo e aplico o operador $fname
somente a %code% .
Btw, obrigado pressa por adicionar o pipe perdido.