Eu uso este comando para renomear arquivos recursivamente:
find -iname \*.bak | rename 's/.bak/.old/'
Mas eu quero excluir o diretório atual. Exemplo:
.bak
dir1/.bak
dir2/.bak
...
Depois eu quero isso:
.bak
dir1/.old
dir2/.old
...
Eu uso este comando para renomear arquivos recursivamente:
find -iname \*.bak | rename 's/.bak/.old/'
Mas eu quero excluir o diretório atual. Exemplo:
.bak
dir1/.bak
dir2/.bak
...
Depois eu quero isso:
.bak
dir1/.old
dir2/.old
...
Com um
find
que suporta o-mindepth
predicado:O
-mindepth
predicado permite definir a profundidade mínima de pesquisa na qual as correspondências podem ser feitas. A profundidade zero é o próprio caminho de pesquisa da raiz (.
), a profundidade 1 é qualquer coisa imediatamente abaixo do caminho de pesquisa da raiz (por exemplo./somename
), e a profundidade 2 é qualquer coisa imediatamente abaixo disso (por exemplo./somename/other
), etc.Observe que a correspondência que
-iname
não diferencia maiúsculas de minúsculas não é necessária, pois vocêrename
não renomeia arquivos que têm outros tipos de capitalização do sufixo do nome do arquivo, então alterei para um-name
teste. Eu também consertei suarename
chamada para que os arquivos com a stringbak
em outro lugar no nome, comorebak.bak
, não sejam renomeados de maneiras estranhas (por exemplo, emr.old.bak
).Eu também adicionei
-type f
parafind
considerar apenas arquivos regulares, ou seja, não diretórios etc.Para uma solução mais portátil:
Isso não depende do
rename
utilitário.Isso chama
rename
diretamente defind
.Relacionado:
Com
bash
, você pode pularfind
completamente e fazerO
**
padrão globbing corresponde a qualquer número de subdiretórios intermediários. Este padrão especial é ativado com aglobstar
opção shell. A inicial./*/
garante que apenas procuremos em subdiretórios do diretório atual, e não no próprio diretório atual.A
dotglob
opção shell garante que correspondamos nomes ocultos com o padrão.O acima, no entanto, não escolheria arquivos regulares exclusivamente (mas seu
find
comando também não). Para fazer isso, use um loop:Isso também renomearia links simbólicos para arquivos regulares.
Tente isso