2

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

Образцы имен файлов из каталога:

Meeting_Packages.pdf
13_textfile0
19_textfile0
23_textfile0
29_textfile0
33_textfile1
45_textfile0
5_textfile3
Membership.pdf
13_textfile1
19_textfile1
23_textfile1
29_textfile1
34_textfile0
46_textfile0
6_textfile0
xyz2009.pdf
13_textfile2
19_textfile2
23_textfile2
29_textfile2
34_textfile1
47_textfile0
6_textfile1
meeting.ics

Я хочу , чтобы переименовать файлы , например Meeting_Packages.pdf Membership.pdf meeting.ics и xyz2009.pdf в файл , откуда они пришли (входной файл). На самом деле это вывод ripmime с письмами, так как xx_textfilex и другие являются вложениями. Я хочу назвать вложения в качестве исходного входного файла

Мой код:

#!/bin/bash

FILES=*.mime
for f in $FILES
do
    echo "Processing $f"
    #rip mails into attachments and text files also add a prefix to text files
    ripmime -i $f -d ~/test/ripmime --prefix 
    #Remove white spaces from files 
    rename 's/ /_/g' ~/test/ripmime/*
    #rename attachments as original input files
    rename 's/\[^0-9]/'$f/ ~/test/ripmime/* 
done

Моя проблема - последняя строка переименования, где я пытаюсь фильтровать файлы, отличные от xx_textfilex и переименовывать. Я пробовал разные регулярные выражения, но не мог этого сделать. Я могу выбрать и переименовать текстовые файлы:

rename 's/textfiles/'$f/ ~/test/ripmime/*

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

Как я могу это сделать?

2 ответа2

1

Вы можете комбинировать ls и grep -v:

ls | grep -v ".*textfile.*" | while read filename; do
  # rename $filename to something
done
0

Я использую https://gist.github.com/995151

rename 's/\.bak$//' *.pdf

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