Removendo a extensão de múltiplos arquivos sem usar o loop no linux [closed]

0

Arquivos de amostra:

RBFATL001USCGA002.--K1234--
RCAVTL001USCGA043.--K2135--

Saída:

RBFATL001USCGA002
RCAVTL001USCGA043
    
por Himanshu Sahoo 08.09.2017 / 11:58

2 respostas

5

Sempre haverá um loop. Possivelmente você quer dizer que você quer uma ferramenta que esconda esse loop para você?

Em seguida, você pode usar perl do rename (às vezes chamado de prename ou perl-rename ):

rename 's/\.[^.]+\.*\z//s' ./*.*

Ou zsh ' zmv :

autoload zmv
zmv '(*).[^.]##.#' '$1'

Por padrão, eles não renomeariam os arquivos ocultos (aqueles cujo nome começa com . ). Se você quisesse processá-los também, você faria:

zmv '(?*).[^.]##.#(#qD)' '$1'

Eles consideram que em .foo.bar. , a extensão é .bar. (e não considere foo... ter uma extensão). Você pode se adaptar se quiser considerar que é . ( zmv '(?*).*(#qD)' '$1' ). Não espero que você queira considerá-lo como .foo.bar. (que zmv '*(#qD)' '${f%%.*}' removeria (mas falhará, pois um arquivo não pode ter um nome vazio)).

Observe também que, em file.tar.gz , a extensão é considerada .gz , não .tar.gz .

Para fazer isso de forma recursiva:

zmv '(**/)(?*).[^.]##.#(#qD)' '$1$2'

Ou com rename :

find . -depth -name '?*.*' -exec rename 's/\.[^./]+\.*\z//s' {} +
    
por 08.09.2017 / 12:03
1

Aqui está uma abordagem sem usar o loop.

find . -type f -name "?*.*" -exec sh -c 'mv -v "$0" "${0%.*}"' '{}' \;
    
por 08.09.2017 / 12:19