NOTA: Ao escrever o abaixo, eu estava usando o OpenBSD find
com o qual -execdir utility {} ';'
irá substituir {}
pelo nome base dos arquivos encontrados. Com% GNUfind
, o {}
também será o nome base do arquivo encontrado, mas será adicionalmente adicionado por ./
, que renderiza o primeiro comando find
abaixo de inútil. Para usuários do GNU find
(a maioria das pessoas no Linux, por exemplo), vá até as outras variações da solução.
Você deseja encontrar todos os arquivos .c
dentro ou abaixo do diretório lokesh
e prefixar seus nomes com x_
.
find lokesh -type f -name '*.c' -execdir echo mv {} x_{} ';'
As expressões -type f
e -name '*.c'
encontrarão todos os arquivos relevantes, enquanto -execdir mv {} x_{} ';'
renomeará os arquivos encontrados.
A expressão -execdir
não é padrão, mas a maioria das implementações de find
oferece suporte a ela. Ele difere de -exec
em que o utilitário fornecido é executado com o diretório pai do caminho encontrado como o diretório de trabalho. O {}
na linha de comando será, portanto, o nome de base dos arquivos que queremos renomear (não o nome completo do caminho como -exec
).
Execute uma vez e, em seguida, remova o echo
quando tiver visto que ele faz a coisa correta. O echo
impedirá que o mv
realmente renomeie os arquivos.
Em sistemas que não suportam -execdir
(ou que não faz -execdir
como o OpenBSD faz):
find lokesh -type f -name '*.c' \
-exec sh -c 'for name do echo mv "$name" "${name%/*}/x_${name##*/}"; done' sh {} +
ou, mais curto, mas sempre menos eficiente,
find lokesh -type f -name '*.c' \
-exec sh -c 'echo mv "$1" "${1%/*}/x_${1##*/}"' sh {} ';'
Ambas as variações empregam um script de shell curto que basicamente faz a mesma coisa no final:
mv "$name" "${name%/*}/x_${name##*/}"
Isso move o arquivo com seu nome de caminho completo em $name
para um novo nome prefixado por x_
no mesmo diretório. A substituição do parâmetro ${name%/*}
é equivalente a $( dirname "$name" )
e fornecerá o diretório pai do nome do caminho, enquanto ${name##*/}
é equivalente a $( basename "$name" )
, o que fornecerá o nome da base (o nome do arquivo) do nome do caminho.