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.