Como encontro nomes de arquivos correspondentes em uma listagem de diretórios?

2

Tenho muitas imagens ISO no meu disco rígido e tenho todo o conteúdo delas listado em um arquivo de texto no seguinte formato:

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

exemplo:

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

Agora, quero emitir um comando grep nesse arquivo de texto para localizar arquivos que contenham "imagens" em seus nomes. O resultado esperado seria (para o exemplo anterior):

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

Alguma idéia de como realizar algo assim usando o grep? Alternativas? Obrigado!

    
por Pomario 21.08.2012 / 21:52

4 respostas

5

Veja como fazer isso com grep , usando a sintaxe de expressão regular Perl -P e a opção somente correspondência correspondência-parte -o :

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

que retorna:

OS Backups.iso, background/pictures.jpg
Pictures vacation 2011.iso
  • para cada linha, grep primeiro verifica se há arquivos .iso com "imagens" em seu nome, que também contém um arquivo com "imagens" em seu nome, por exemplo:
    Pictures vacation 2011.iso, italy/pictures5.jpg
  • Se encontrar, imprime a linha e segue em frente; se não, verifica se é um arquivo .iso com "imagens" em seu nome;
  • Em caso afirmativo, imprime apenas o nome ISO; se não, verifica se esta linha contém um arquivo com "imagens" em seu nome ...
por ish 21.08.2012 / 22:54
3
$ awk -F ", " 'BEGIN { IGNORECASE=1 }  ~ /pictures/ { print  ; next }  ~ /pictures/ { print }' < context.txt | sort | uniq
OS Backups.iso, background/pictures.jpg
Pictures vacation 2011.iso
    
por Ignacio Vazquez-Abrams 21.08.2012 / 22:38
2
#!/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)

Produz a saída desejada quando executado como python test.py index.txt pictures

    
por RobotHumans 21.08.2012 / 22:26
-1
import fileinput
import sys
lookFor = sys.argv[1]
for line in fileinput.input("textfile.txt"):
    if lookFor in line:
            print line

Você pode executar este script com python scriptName.py WORDTOLOOKFOR Por exemplo, se eu quiser verificar uma linha no arquivo de texto contendo a palavra "ubuntu", e o script é chamado script.py eu escrevo o seguinte

python script.py ubuntu

Certifique-se de renomear o arquivo de texto no script.

Edit: Isto irá imprimir apenas as linhas que o contêm, e não armazená-lo em qualquer lugar, muito parecido com o que o grep pode fazer.

    
por Erro 21.08.2012 / 23:10