Confundido por 'renomear'

2

Eu tenho esta lista de arquivos:

$ find .
.
./   sdf.sdf
./  dkfjd  L
./aaa*
./aaa*bbb
./aaa:bbb
./b
./b/c
./b/c/xxx.123

Se eu rename -n -e 's/\*|\:/_/g' -e 's/^\ +//' * obtenho o que quero:

'   sdf.sdf' would be renamed to 'sdf.sdf'
'  dkfjd  L' would be renamed to 'dkfjd  L'
'aaa*' would be renamed to 'aaa_'
'aaa*bbb' would be renamed to 'aaa_bbb'
'aaa:bbb' would be renamed to 'aaa_bbb'

Mas se eu fizer find . | rename -n -e 's/\*|\:/_/g' -e 's/^\ +//' , obtenho:

Reading filenames from STDIN
'./aaa*' would be renamed to './aaa_'
'./aaa*bbb' would be renamed to './aaa_bbb'
'./aaa:bbb' would be renamed to './aaa_bbb'

Por que o segundo comando NÃO vê os diretórios começando com espaços?

Eu também tentei find . -print0 | rename -n -0 -e 's/\*|\:/_/g' -e 's/^\ +//' , mas isso não fez diferença.

Eu preciso executar o rename em uma árvore grande; existe alguma outra maneira de recorrer a subdiretórios?

Observação: no final, eu vou usar isso com mdfind não find , então não posso usar a opção -exec .

    
por Ze'ev 22.09.2016 / 11:03

1 resposta

3

Isso renomeará arquivos e diretórios (bem, qualquer coisa que corresponda, na verdade). Eu especifiquei -depth para que os diretórios de nível mais alto não sejam renomeados até que o conteúdo tenha sido processado com segurança.

find . -depth | rename -n -e 'y{*:}{_}; s{(?<=/)\s+(?!.*/.*$)}{}'

A renomeação é construída a partir de duas ERs. (Meu rename aceita apenas um argumento -e {RE} , então concatenei as duas operações no parâmetro único.)

O primeiro é simples: y{*:}{_} substitui * ou : por _ (também conhecido como Unix tr ).

O segundo é mais complicado e usa lookbehind e lookahead para combinar o componente necessário. Ele diz que a expressão \s+ a ser processada deve ser imediatamente precedida por / e não deve ser seguida por / em qualquer lugar no restante do nome do arquivo.

Saída

rename(./  dkfjd  L, ./dkfjd  L)
rename(./aaa*, ./aaa_)
rename(./aaa*bbb, ./aaa_bbb)
rename(./   sdf.sdf, ./sdf.sdf)
rename(./aaa:bbb, ./aaa_bbb)
    
por 22.09.2016 / 12:40

Tags