2013-07-19 3 views
5

У меня есть список имен файлов в каталоге (/path/to/local). Я хотел бы удалить определенное количество символов из всех этих имен файлов.Bash-скрипт для удаления «х» количества символов в конце нескольких имен файлов в каталоге?

Пример имен файлов:

iso1111_plane001_00321.moc1 
iso1111_plane002_00321.moc1 
iso2222_plane001_00123.moc1 

В каждом имени файла Я хочу, чтобы удалить последние 5 символов перед расширением файла.

Например:

iso1111_plane001_.moc1 
iso1111_plane002_.moc1 
iso2222_plane001_.moc1 

Я считаю, что это может быть сделано с помощью sed, но я не могу определить точное кодирование. Что-то вроде ...

for filename in /path/to/local/*.moc1; do 
    mv $filname $(echo $filename | sed -e 's/.....^//'); 
done 

... но это не работает. Извините, если я отключил опции sed, у меня нет большого опыта.

+0

'^' начало строки, по определению ничего не может быть перед ней. – Kevin

ответ

6
mv $filname $(echo $filename | sed -e 's/.....\.moc1$//'); 

или

echo ${filename%%?????.moc1}.moc1 

%% является внутренний оператор баш ...

+0

Спасибо! Второй вариант, который вы представили, отлично работает в сценарии bash. – user2600230

+0

Пример sed неверен (не учитывает расширение), но +1 для решения bash –

+0

@glennjackman, как он не учитывает расширение? –

1

Эта sed команда будет работать для всех примеров, которые Вы дали.

sed -e 's/\(.*\)_.*\.moc1/\1_.moc1/' 

Однако, если вы просто хотите конкретно «удалить 5 символов перед последним расширением в имени файла» эта команда, что вы хотите:

sed -e 's/\(.*\)[0-9a-zA-Z]\{5\}\.\([^.]*\)/\1.\2/' 

Вы можете реализовать это в сценарии, как так :

for filename in /path/to/local/*.moc1; do 

    mv $filename "$(echo $filename | sed -e 's/\(.*\)[0-9a-zA-Z]\{5\}\.\([^.]*\)/\1.\2/')"; 

done 

Первая команда Объяснение

Первые sed команда работает по не захватывая все символы до первого подчеркивания: \(.*\)_

Затем он отбрасывает все символы до тех пор, пока не найдет .moc1: .*\.moc1

Затем он заменяет текст, который он нашел все, что вцепились в первом в скобках: /\1

и, наконец, добавляет расширение .moc1 назад на конце и заканчивается регулярное выражение: .moc1/

Второй команда Объяснение

Вторая sed команда работает путем захвата всех символов в первом: \(.*\)

И тогда он вынужден остановить захват символов, поэтому он может сбросить пять символов, или более конкретно, пяти символов которые лежат в диапазоне 0-9, AZ и AZ: [0-9a-zA-Z]\{5\}

Затем наступает дот '.' символ, чтобы отметить последнее расширение: \.

И затем он ищет все неточечные символы. Это гарантирует, что мы захватывая расширение последнего: \([^.]*\)

Наконец, он заменяет все, что текст с первыми и вторыми группами захвата, отделенный . характера, и заканчивается регулярное выражение: /\1.\2/

+0

Спасибо за объяснение! Я попробую это. – user2600230

+0

Благодарим за код, который нужно нарисовать на основе персонажа - хотя это был не вопрос OPs - он был моим – kris

0

Это может работа для вас (GNU sed):

sed -r 's/(.*).{5}\./\1./' file 
Смежные вопросы