Renomeia a string inicial no nome do arquivo

0

Eu preciso remover dinamicamente a primeira parte do nome e copiar para outros locais. Meus nomes de arquivos são como

Voice_XYZZ_1_1801.pdf
Voice_XYZZ_1_1801.ndx
Electon_MNOPQ_1_1801.pdf
Electon_MNOPQ_1_1801.ndx

em tempo de execução, o Voice pode gerar ou o Electon ou ambos. Eu preciso remover a parte inicial dos nomes dos arquivos e eles devem se parecer com

XYZZ_1_1801.pdf
XYZZ_1_1801.ndx
MNOPQ_1_1801.pdf
MNOPQ_1_1801.ndx

Qual comando eu posso usar para conseguir isso?

    
por SHa 01.05.2018 / 03:11

2 respostas

0

Supondo que você esteja usando um shell da família Bourne, é possível remover a menor correspondência de substring de início até e incluindo um sublinhado de uma variável de nome de arquivo f usando ${f#*_}

Ex.

$ touch Voice_XYZZ_1_1801.pdf Voice_XYZZ_1_1801.ndx Electon_MNOPQ_1_1801.pdf Electon_MNOPQ_1_1801.ndx

$ for f in Voice_* Electon_*; do echo "${f#*_}"; done
XYZZ_1_1801.ndx
XYZZ_1_1801.pdf
MNOPQ_1_1801.ndx
MNOPQ_1_1801.pdf

Você pode usar isso junto com o comando mv para renomear arquivos.

for f in Voice_* Electon_*; do mv "$f" "${f#*_}"; done

Copiar para outro local pode ser feito de forma semelhante com o comando cp , por exemplo,

for f in Voice_* Electon_*; do cp "$f" "newdir/${f#*_}"; done
    
por 01.05.2018 / 04:06
0

Isso pode ser feito facilmente a partir da linha de comando, chamando uma linha do Perl:

ls *_* | perl -ne 'chomp($_); $orig = $_; $_ =~ s/[^_]*_//; rename $orig,$_;'

Aqui está uma explicação para o código:

  • Envie todos os nomes de arquivos que têm '_' em seu nome para o próximo comando

    ls _ |

  • Para cada uma das strings sendo passadas, faça o comando

    perl -ne

  • Remova a nova linha do nome do arquivo (o restante da execução do comando 'ls')

    chomp ($ _);

  • Remova a primeira parte da palavra, procurando até encontrar um '_'

    $ _ = ~ s / [^ ] * //;

  • Renomeie o arquivo

    renomear $ orig, $ _;

por 01.05.2018 / 06:37

Tags