Estou usando zsh no MX Linux 23.2.
Durante anos tentei descobrir por que um comando como
find . -depth -type f -execdir rename 's/_720p//' {} \;
pula arquivos.
Eu sei que meu gerenciador de arquivos não é confiável para mostrar as alterações, então verifico digitando ls
no terminal. Veja só! Existem arquivos listados com '_720p' ainda no nome.
Tentei enviar o processo para segundo plano e usar wait
, mas obtive os mesmos resultados. A única coisa que encontrei é algo como
while [ ! .(NF) ]; do
filename=$(find . -type f -print0 -quit)
rename 's/_720p//' $filename
mv $filename $HOME/Videos
done
Nunca vi outra pergunta nem remotamente semelhante a esta. Sou a única pessoa no Linuxverse que não consegue acertar? Qual é o problema?
s/_720p//
substitui apenas a primeira ocorrência de_720p
por nada, então renomearia umfoo_720p_bar_720p
arquivo parafoo_bar_720p
.Você precisa adicionar o
g
sinalizador para substituir cada ocorrência:s/_720p//g
, mas mesmo assim, um arquivo chamadofoo_72_720p0p
por exemplo possui apenas uma ocorrência de,_720p
mas seria renomeado parafoo_720p
assim que essa ocorrência fosse removida.Nesse caso , você precisaria
while (s/_720p//g) {}
tentar novamente a substituição até não encontrar nada.rename
Observe também que algumas implementações baseadas em Perl têm a-d
opção de operar apenas no nome base dos arquivos, o que evitaria a necessidade de executar umrename
por arquivo¹Observe que
zsh
possui um renomeador de lote integrado nazmv
função de carregamento automático:Substituiria todas as ocorrências. Para lidar com os
_72_72_720p0p0p
casos:Onde
f
faz com que o seguintes
modificador seja repetido até que não haja modificação.¹ Mas não se beneficiaria com as melhorias de segurança de
-execdir
. Observe que algumasfind
implementações também suportam{} +
,-execdir
embora ainda seja necessário executar pelo menos umarename
por diretório.