根据特定行移动文件到另一个目录
我在一个文件夹里有一些文本文件。我想要读取这个文件夹里的所有文件,如果某个文件里面有以下这一行:
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
使用 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