2010-01-06 79 views
0

我有一个目录有很多的文件,我想循环到每个文件,并打开它搜索特定的单词,然后我找到的单词将文件复制到另一个目录。脚本来过滤文件

感谢

+1

grep是你的朋友。 – miku 2010-01-06 13:13:39

+2

陈述您的操作系统,下次您可以使用哪些工具 – ghostdog74 2010-01-06 14:46:29

+0

“批处理”标记*通常包含有关Windows批处理文件或SQL批处理插入的问题。迄今为止几乎没有例外。 – Joey 2010-01-06 22:26:33

回答

0

简单的循环会照顾它给你:

for x in `grep -l <your pattern> *` 
do 
    cp $x <new path>/$x 
done 

只是柜面它在文件名称中的空格:

grep -l <your pattern> * | while read file 
do 
    cp $file <new path>/$file 
done 
1
grep -r "term" . | sed -e 's/:.*//' | uniq | xargs -I {} cp -v {} /target/dir 

..假设你在你的手有grep

0

创建一个批处理文件是这样的:

FOR /F "usebackq delims==" %%i IN (`findstr /M "xxx_string_to_search_xxx" c:\source\*.*`) DO copy %%i c:\destination\ 

它会用C SEACH为xxx_string_to_search_xxx:\源和这些文件复制到C:\目的地

0

的Python

import os 
import shutil 
for path, dirs, files in os.walk('path/to/dir'): 
    for name in files: 
     aFileName= os.path.join(path,name) 
     with open(aFileName, "r") as content: 
      if "myword" in content: 
       shutil.copy(aFileName, "path/to/other/dir") 

这应该工作得很好。我没有广泛测试它,但你可以看到这是如何工作的。

0

假设Linux和使用bash shell的

#!/bin/bash 
dest="/destination" 
shopt -s nullglob 
for file in * 
do 
    grep "searchterm" "$file" && mv "$file" "$dest" 
done 
0

好的,如果我理解正确,你想:

  • 文件移动到一个特定的目录
    • 根据是否在文件中出现某个词或不
  • 这应该对所有文件进行目录中的

如果我说得对,那其实很简单。

简短的回答:

for %%f in (*) do (
    findstr "foo" "%%f" > NUL 2>&1 
    if not errorlevel 1 copy "%%f" "some_directory" 
) 

更详细的解释:

首先遍历一组文件(是的, “所有文件”,也是一组文件)可以使用for命令轻松完成:

for %%f in (*) do ... 

然后你想知道一个特定的单词(假设它是"foo")是否出现在文件中。这可以用findstr命令来检查:现在

findstr "foo" "%%f" 

,这将在默认情况下,输出的每个地方"foo"被发现屏线。也许甚至错误信息,所以我们重定向到那些虚无:

> NUL 2>&1 

findstr返回一个特定的数字代码,根据给定的字符串是否被发现或没有。虽然你通常看不到它,但我们仍然可以测试它。这个特定的代码被称为错误级别,这预示着可能会回到Ye Olde DOS天,甚至可能是CP/M。无论如何,这个错误级别是01。当它为0时,表示文本被找到,当它是1时,则文本未找到或发生其他错误。

有一个特殊的语法来测试有一个小怪癖的错误级别:它测试错误级别是否至少某个数字。因此,用于测试0我们需要反转,但不要紧太多:

if not errorlevel 1 copy "%%f" "some_directory" 

这将文件移到some_directory,但如果误差水平不是至少1,在其他字:完全是0.这意味着我们在文件中搜索的文本已经找到。

全部放在一起,这个现在看起来如下:

for %%f in (*) do (
    findstr "foo" "%%f" > NUL 2>&1 
    if not errorlevel 1 copy "%%f" "some_directory" 
) 

这是不是太狠了,是吗?


PS:我们可以缩短这一点,因为该批处理文件语言具有一种特殊的语法来执行命令只有当其他命令成功:

for %%f in (*) do (findstr "foo" "%%f" >NUL 2>&1 && copy "%%f" "some_directory") 

我们得到了它成一个单一的现在在线。但由于copy还输出文本,我们可以将重定向到该行的末尾赶上findstr无论是产量和copy输出:

for %%f in (*) do (findstr "foo" "%%f" && copy "%%f" "some_directory") >NUL 2>&1 

而且因为它是一个单一的线,我们不需要一个批处理文件了(当然,严格来说,我们并不需要在此之前,无论是),可撤销该双%直接在命令行中运行它:

for %f in (*) do @(findstr "foo" "%f" && copy "%f" "some_directory") >NUL 2>&1 

我包括左括号之前的@抑制正在运行的命令的输出,否则你的s creen会很快完成所运行的命令。在批处理文件中,通常只包含第一行的@echo off