Renomeie arquivos e diretórios com find -execdir | rename
Se você vai renomear arquivos e diretórios, não apenas com um sufixo, esse é um bom padrão:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
A -execdir
opção impressionante faz um cd
no diretório antes de executar o rename
comando, ao contrário -exec
.
-depth
verifique se a renomeação ocorre primeiro nos filhos e, depois, nos pais, para evitar possíveis problemas com os diretórios-pai ausentes.
-execdir
é necessário porque a renomeação não funciona bem com caminhos de entrada sem nome de base, por exemplo, o seguinte falha:
rename 's/findme/replaceme/g' acc/acc
A PATH
invasão é necessária porque -execdir
tem uma desvantagem muito irritante: find
é extremamente opinativa e se recusa a fazer qualquer coisa -execdir
se você tiver algum caminho relativo em sua PATH
variável de ambiente, por exemplo ./node_modules/.bin
, falhando com:
find: O caminho relativo './node_modules/.bin' está incluído na variável de ambiente PATH, que é insegura em combinação com a ação -execdir de find. Remova essa entrada de $ PATH
Consulte também: /ubuntu/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378
-execdir
é uma extensão de localização GNU para POSIX . rename
é baseado em Perl e vem do rename
pacote. Testado no Ubuntu 18.10.
Mudar o nome da solução alternativa à procura
Se seus caminhos de entrada não vierem find
, ou se você já teve o suficiente do aborrecimento do caminho relativo, podemos usar alguns Perl lookahead para renomear com segurança diretórios como em:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
Eu não encontrei um análogo conveniente para -execdir
com xargs
: xargs: mudança de diretório de trabalho para o caminho do arquivo antes de executar?
O sort -r
é necessário para garantir que os arquivos vir após seus respectivos diretórios, desde caminhos mais longos vir após mais curtos com o mesmo prefixo.
rename
ou Red Hatrename
?