2014-12-29 2 views
0

У меня есть папка с большим количеством файлов, имеющих шаблон, который некоторые строки следуют дата и время:Extract часть имени файла в Баш

BOS_CRM_SUS_20130101_10-00-10.csv (3 strings before date) 
SEL_DMD_20141224_10-00-11.csv (2 strings before date) 
SEL_DMD_SOUS_20141224_10-00-10.csv (3 strings before date) 

Я хочу перебрать папку и выписки только часть перед датой и вывод в файл.

Output 
BOS_CRM_SUS_ 
SEL_DMD_ 
SEL_DMD_SOUS_ 

Это мой сценарий, но он не работает

#!/bin/bash 

# script variables 
FOLDER=/app/list/l088app5304d1/socles/Data/LEMREC/infa_shared/Shell/Check_Header_T24/ 

LOG_FILE=/app/list/l088app5304d1/socles/Data/LEMREC/infa_shared/Shell/Check_Header_T24/log 

echo "Starting the programme at: $(date)" >> $LOG_FILE 

# Getting part of the file name from FOLDER 
for file in `ls $FOLDER/*.csv` 
do 
    mv "${file}" "${file/date +%Y%m%d HH:MM:SS}" 2>&1 | tee -a $LOG_FILE 
done #> $LOG_FILE 
+0

'Эхо BOS_CRM_SUS_20130101_10-00-10.csv | sed -r 's/(.*) 20 [01] [0-9]. */\ 1 /' ' – anishsane

+0

Шаблон в' $ {file/pattern/replace} 'является шаблоном глобирования имени файла, а не оболочкой команда. – Barmar

+1

Вы можете пойти и изменить свой цикл на 'для файла в« $ FOLDER »/ *. Csv' –

ответ

2

Использования sed с расширенными-регулярными выражениями и группами для достижения этой цели.

cat filelist | sed -r 's/(.*)[0-9]{8}_[0-9][0-9]-[0-9][0-9].[0-9][0-9].csv/\1/' 

где filelist находится файл со всеми именами, которые вам небезразличны. Конечно, это просто местозаполнитель, потому что я не знаю, как вы собираетесь перечислять все подходящие файлы. Если Глоб будет делать, к примеру, вы можете сделать

ls mydir/*.csv | sed -r 's/(.*)[0-9]{8}_[0-9][0-9]-[0-9][0-9].[0-9][0-9].csv/\1/' 
+0

спасибо, что оба работают отлично – Malyk

3

Предполагая, что вы не будете иметь номера в первой части, вы можете использовать:

$ for i in *csv;do str=$(echo $i|sed -r 's/[0-9]+.*//'); echo $str; done 
BOS_CRM_SUS_ 
SEL_DMD_ 
SEL_DMD_SOUS_ 

Или с parameter substitution:

$ for i in *csv;do echo ${i%_*_*}_; done 
BOS_CRM_SUS_ 
SEL_DMD_ 
SEL_DMD_SOUS_ 
2

Замещение:

"${file/date +%Y%m%d HH:MM:SS}" 

вряд ли что-либо сделает, потому что он не выполняет date +%Y%m%d HH:MM:SS. Он просто рассматривает его как образец для поиска, и его не найти.

Если вы выполнили эту команду, вы получите текущие дату и время, что также (по-видимому) не то, что вы находите в имени файла.

Если модель является точным, то вы можете сделать следующее:

echo "${file%????????_??-??-??.csv}" >> "$LOG_FILE" 
3

При использовании ${var/pattern/replace}, то pattern должен быть именем Glob, а не команда.

Вместо того чтобы использовать оператор подстановки, использовать оператор удаления модели

mv "${file}" "${file%_*-*-*.csv}.csv" 

% находит самый короткий матч рисунка в конце переменной, так что эта схема будет просто соответствовать дате и времени часть имя файла.

1

использованием grep:

ls *.csv | grep -Po "\K^([A-Za-z]+_)+" 

выход:

BOS_CRM_SUS_ 
SEL_DMD_ 
SEL_DMD_SOUS_ 
Смежные вопросы