0

我在目录中有一些文本文件。我想读取这个目录中的所有文件,如果文件有以下行

SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY 将该文件及其所有内容移动到另一个目录。

我怎样才能做到这一点?

4

3 回答 3

4

使用findgrep

$ find . -type f -exec \
  fgrep -l "SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY" {} \; \
  | xargs -i%  mv % /path/to/new/dir
于 2013-02-04T11:45:02.653 回答
0

这在 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 (匹配的文件名)的输出中一次取一行,并且 {} 所在的位置将扩展为该文本并且命令将运行。

于 2013-02-04T12:07:52.873 回答
0

这是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()
于 2013-02-04T12:39:09.007 回答