Não renomear o diretório filho quando o diretório pai é renomeado

Não renomear o diretório filho quando o diretório pai é renomeado

Minha árvore de diretórios é semelhante a esta -

/media/blueray/Data/Test$ tree
.
├── What????
│   └── What????
└── What????.txt

Quando executo o comandofind . -depth | rename 's/[?<>\\:*|\"]//g'

Diz -

Can't rename ./What????/What???? ./What/What: No such file or directory

No entanto, após executar o comando, a estrutura de diretórios torna-se -

/media/blueray/Data/Test$ tree
.
├── What
│   └── What????
└── What.txt

Parece-me que findestá começando a procurar do topo da árvore, então está perdendo o controle da árvore.

Qual é a solução aqui?

Responder1

O problema não é causado por find, é causado por rename: ele está processando o caminho completo, então tenta renomear ./What????/What????para ./What/What, o que falha porque o Whatdiretório não existe (ainda).

Processar renameapenas nomes de arquivos, com -d, corrigirá isso:

find . -depth | rename -d 's/[?<>\\:*|\"]//g'

Se a sua versão do renamenão suporta a -dopção (introduzida na versão 1.10 do File::Rename, assumindo que a sua renameé a versão Perl), você pode findpassar os nomes dos arquivos apenas executando renamedentro de cada diretório:

find . -depth -execdir rename 's/[?<>\\:*|\"]//g' {} +

(Graças aFreddieparaa solução.)

informação relacionada