Мне нужно переименовать некоторые файлы в Unix. Я хочу усечь последние два подчеркивания и все, что следует за ними. Например:

abc_def_ghi_121222_as.csv -> abc_def_ghi.csv

xy_cv_sac_bnmkj_ppa_jkl_lkkjll.csv -> xy_cv_sac_bnmkj_ppa.csv

Как мне этого добиться?

3 ответа3

1

Этот скрипт должен работать:

#!/bin/bash

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

Поместите его в папку, в которую вы хотите переименовать файлы и запустите его. Он переименует все файлы, оканчивающиеся на csv с их текущего имени на имя перед последними двумя подчеркиваниями.

0

Спасибо @mtak @mestia, у меня также есть альтернатива

 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

Спасибо, С.

0

Вы можете использовать rename Perl для достижения этой цели. Это должно прийти с дистрибутивом Perl; в Debian он упакован как часть пакета perl под именем prename с псевдонимом для rename .

Например:

$ 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
$

Это обрабатывает все заданные имена файлов, применяя предоставленное регулярное выражение и переименовывает каждый файл в результат.

Perl должен быть доступен в большинстве систем, так что, хотя это и не строго решение оболочки, это не должно считаться экзотикой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .