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

SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY переместить этот файл со всем его содержимым в другой каталог.

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

0
user2039457 4 Фев 2013 в 15:39

3 ответа

Лучший ответ

Используя find и grep:

$ find . -type f -exec \
  fgrep -l "SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY" {} \; \
  | xargs -i%  mv % /path/to/new/dir
4
Chris Seymour 4 Фев 2013 в 11:45

Вот решение в Python. Os.path.isdir () был необходим для обхода подкаталогов. "And file [-3:]! = '.Py'" необходим, если вы запускаете этот скрипт .py из исходного каталога. Кроме того, вы можете просто проверить имя скрипта, если вам нужно переместить .py файлы.

import os
import shutil

src = '/source'
dst = '/destination'
pattern = 'SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY'
for file in os.listdir(src):
  if not os.path.isdir(file):
    f = open(file)
    for line in f:
      if pattern in line and file[-3:] != '.py':
        f.close()
        shutil.move(file,dst)
        break
    f.close()
0
Octipi 4 Фев 2013 в 12:39

Это легко в bash:

grep -l "PATTERN" *

Дает вам список файлов, который содержит PATTERN в текущем каталоге. Так что, если у вас нет слишком много файлов, вы можете сделать:

mv `grep -l "SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY"` /another/directory

Обратные галочки (они не являются обычными кавычками) выполняет команду и заменяет ее выводом (в данном случае списком файлов). Вместо обратных тиков вы можете использовать $ (команда). Так что вы можете написать:

mv $(grep -l "SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY") /another/directory

Если у вас много файлов, bash не сможет расширить такое количество файлов (вы достигнете предела того, насколько большой будет ваша команда ... это много). Затем вы должны прибегнуть к xargs:

grep -l "SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY" | xargs -i mv {} /another/directory

От -i к xargs означает, что он будет занимать одну строку за раз из выходных данных grep (совпадающее имя файла), и где {} будут расширены до этого текста, и команда будет выполнена.

0
Aquaplanet 4 Фев 2013 в 12:07