Как найти подходящие имена файлов в списке каталогов?

У меня есть куча ISO-образов на жестком диске, и все их содержимое занесено в текстовый файл в следующем формате:

<immage>.iso, <dir structure>/<filename>.<extension>

пример:

OS Backups.iso, ­ubuntu-­12.­04-­desktop-­i386.­iso 
OS Backups.iso, xubuntu-12.04-desktop-i386.iso
OS Backups.iso, background/pictures.jpg
Pictures vacation 2011.iso, documents/cost_estimates.xls
Pictures vacation 2011.iso, italy/img1.jpg
Pictures vacation 2011.iso, italy/img2.jpg

Теперь я хотите выполнить команду grep для этого текстового файла, чтобы найти файлы, содержащие «картинки» в своих именах. Ожидаемый результат будет (для предыдущего примера):

Pictures vacation 2011.iso
OS Backups.iso, background/pictures.jpg

Любые идеи о том, как сделать что-то подобное, используя grep? Альтернативы? Спасибо!

2
задан 23 August 2012 в 00:08

4 ответа

Вот то, как сделать это с grep, с помощью синтаксиса регулярного выражения Perl -P, и переключатель return-only-matching-part -o:

grep -Poi "(.*pictures.*\.iso.*pictures.*|.*pictures.*\.iso|.*pictures.*)"  | sort | uniq

, который возвращается:

OS Backups.iso, background/pictures.jpg
Pictures vacation 2011.iso
  • для каждой строки, grep первые проверки, если это .iso файлы с "изображениями" на ее имя, , который также содержит файл с "изображениями" на ее имя, например:
    Pictures vacation 2011.iso, italy/pictures5.jpg
  • , Если это находит, это печатает строку и идет дальше; в противном случае это проверяет, ли это .iso файлы с "изображениями" на его имя;
  • Если так, это печатает просто имя ISO; в противном случае это проверяет, содержит ли эта строка файл с "изображениями" на его имя...
5
ответ дан 23 August 2012 в 00:08
$ awk -F ", " 'BEGIN { IGNORECASE=1 } $1 ~ /pictures/ { print $1 ; next } $2 ~ /pictures/ { print }' < context.txt | sort | uniq
OS Backups.iso, background/pictures.jpg
Pictures vacation 2011.iso
3
ответ дан 23 August 2012 в 00:08
#!/usr/bin/env python

import re, sys
a_file = sys.argv[1]
a_string = sys.argv[2]

#from http://www.peterbe.com/plog/uniqifiers-benchmark
def uniquify(seq, idfun=None): 
   # order preserving
   if idfun is None:
       def idfun(x): return x
   seen = {}
   result = []
   for item in seq:
       marker = idfun(item)
       # in old Python versions:
       # if seen.has_key(marker)
       # but in new ones:
       if marker in seen: continue
       seen[marker] = 1
       result.append(item)
   return result

mylist = []

with open(a_file, 'r') as items:
    for line in items.readlines():
        if (re.search(a_string, line, re.IGNORECASE)):
            temp = line.split(',',1)
            if (re.search(a_string, temp[0], re.IGNORECASE)):
                mylist.append(temp[0])
            else:
                mylist.append(line.rstrip())

mylist = uniquify(mylist)
for item in mylist:
    print(item)

Производит желаемый вывод, когда выполнено как python test.py index.txt pictures

2
ответ дан 23 August 2012 в 00:08
import fileinput
import sys
lookFor = sys.argv[1]
for line in fileinput.input("textfile.txt"):
    if lookFor in line:
            print line

Можно запустить этот скрипт с python scriptName.py WORDTOLOOKFOR Например, если я хочу проверить на строку в текстовом файле, содержащем слово "человечность", и сценарий называют script.py, который я пишу следующему

python script.py ubuntu

Обязательно переименуйте текстовый файл в сценарии.

Править: Это только распечатает строки, содержащие его, не сохранит его где угодно, во многом как то, что может сделать grep.

-1
ответ дан 23 August 2012 в 00:08

Другие вопросы по тегам:

Похожие вопросы: