我在目录中有一些文本文件。我想读取这个目录中的所有文件,如果文件有以下行
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 到 xargs 意味着它将从 grep (匹配的文件名)的输出中一次取一行,并且 {} 所在的位置将扩展为该文本并且命令将运行。
这是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()