根据特定行将文件从一个目录移动到另一个目录

时间:2013-02-04 11:39:08

标签: python bash awk grep

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

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

我该怎么做?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这是python中的一个解决方案。 os.path.isdir()是绕过子目录所必需的。如果从源目录运行此.py脚本,则需要“and file [-3:]!='。。''”。或者,如果需要移动.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()