Python 基于特定行将文件从一个目录移动到另一个目录

Python 基于特定行将文件从一个目录移动到另一个目录,python,bash,awk,grep,Python,Bash,Awk,Grep,我在目录中有一些文本文件。我想读取这个目录中的所有文件,如果文件有以下行 SAMPLE 350可以通过将该文件及其所有内容移动到另一个目录来组合类型为DECIMAL:的整数 我如何才能做到这一点?使用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

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

SAMPLE 350可以通过将该文件及其所有内容移动到另一个目录来组合类型为DECIMAL:的整数


我如何才能做到这一点?

使用
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

使用
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" *
提供当前目录中包含模式的文件列表。因此,除非文件太多,否则您可以:

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

这在bash中很容易:

grep -l "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(匹配的文件名)的输出中一次提取一行,{}将被扩展到该文本中,命令将运行。

这里是python中的一个解决方案。绕过子目录需要os.path.isdir()。如果从源目录运行此.py脚本,则需要“and文件[-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()

这里有一个python解决方案。绕过子目录需要os.path.isdir()。如果从源目录运行此.py脚本,则需要“and文件[-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()