我在目录中有一些文本文件。我想阅读此目录中的所有文件,如果文件有以下行
SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY
将该文件的所有内容移动到另一个目录。
我该怎么做?
答案 0 :(得分: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
答案 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()