Unix - Renomeia um arquivo removendo as últimas 2 instâncias de um caractere

0

Eu preciso renomear alguns arquivos no Unix. Eu quero truncar os dois últimos sublinhados e qualquer coisa que os segue. Por exemplo:

abc_def_ghi_121222_as.csv --> abc_def_ghi.csv

xy_cv_sac_bnmkj_ppa_jkl_lkkjll.csv --> xy_cv_sac_bnmkj_ppa.csv

Como posso conseguir isso?

    
por shah 28.04.2014 / 16:10

3 respostas

1

Este script deve funcionar:

#!/bin/bash

for FILE in $(ls)
do
  if [[ $FILE =~ csv$ ]]; then
    [[ $FILE =~ ^(.*)_(.*)_(.*).csv$ ]]
    NEWFILENAME="${BASH_REMATCH[1]}.csv"
    mv $FILE $NEWFILENAME
  fi
done

Coloque na pasta em que você deseja renomear os arquivos e executá-lo. Ele renomeará todos os arquivos terminados em csv de seu nome atual para o nome antes dos últimos dois sublinhados.

    
por 28.04.2014 / 17:11
0

Obrigado @mtak @mestia também tenho uma alternativa

 for f in *[0-9]*.csv;  
do  
x='echo  $f|cut -d. -f1'; 
y='echo $x|rev|sed -e 's/_/$/1'|rev' ; 
z='echo $y|cut -d$ -f1'".csv"  ; 
echo mv "${f}" "${z}";  
done

Obrigado S.

    
por 29.04.2014 / 10:17
0

Você pode usar o Perl rename para fazer isso. Deve vir com a distribuição Perl; no Debian, é empacotado como parte do pacote perl sob o nome prename com um alias para rename .

Por exemplo:

$ ls -1
$ touch abc_def_ghi_121222_as.csv xy_cv_sac_bnmkj_ppa_jkl_lkkjll.csv
$ ls -1
abc_def_ghi_121222_as.csv
xy_cv_sac_bnmkj_ppa_jkl_lkkjll.csv
$ rename 's/_[^_]*_[^_]*\.csv$/.csv/' *
$ ls -1
abc_def_ghi.csv
xy_cv_sac_bnmkj_ppa.csv
$

Isso processa todos os nomes de arquivos fornecidos, aplicando a expressão regular fornecida e renomeia cada arquivo para o resultado.

O Perl deve estar disponível na maioria dos sistemas, portanto, embora não seja estritamente uma solução shell, isso não deve ser considerado exótico.

    
por 29.04.2014 / 10:33

Tags