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

0 投票
3 回答
603 浏览
提问于 2025-04-17 14:41

我在一个文件夹里有一些文本文件。我想要读取这个文件夹里的所有文件,如果某个文件里面有以下这一行:

SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY,那么就把这个文件和里面的所有内容移动到另一个文件夹里。

我该怎么做呢?

3 个回答

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

xargs中的-i选项意味着它会从grep的输出中每次取一行(也就是一个匹配的文件名),然后把{}替换成那一行的内容,接着执行命令。

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()
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

撰写回答