ディレクトリにいくつかのテキスト ファイルがあります。このディレクトリ内のすべてのファイルを読み取りたいのですが、ファイルに次の行がある場合
SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY
そのファイルをすべての内容とともに別のディレクトリに移動します。
これどうやってするの?
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
これは bash では簡単です:
grep -l "PATTERN" *
現在のディレクトリにある PATTERN を含むファイルのリストを表示します。したがって、ファイルが多すぎない限り、次のことができます。
mv `grep -l "SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY"` /another/directory
バックティック (通常の引用符ではありません) はコマンドを実行し、それを出力 (この場合はファイルのリスト) に置き換えます。バックティックの代わりに $(command) を使用できます。したがって、次のように書くこともできます。
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 to xargs は、grep からの出力 (一致するファイル名) から一度に 1 行を取得し、{} がそのテキストに展開され、コマンドが実行されることを意味します。
これがpythonでの解決策です。サブディレクトリをバイパスするには os.path.isdir() が必要でした。この .py スクリプトをソース ディレクトリから実行する場合は、「and file[-3:] != '.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()