用于过滤文件的脚本

时间:2010-01-06 13:09:46

标签: search scripting copy

我有一个包含大量文件的目录,我想循环到每个文件并打开它搜索一个特定的单词然后我找到的单词将文件复制到另一个目录。

由于

6 个答案:

答案 0 :(得分:1)

grep -r "term" . | sed -e 's/:.*//' | uniq | xargs -I {} cp -v {} /target/dir

..假设您手边有grep

答案 1 :(得分:0)

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

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

它将在C:\ source中搜索xxx_string_to_search_xxx并将这些文件复制到C:\ destination

答案 2 :(得分: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" )

这应该足够好了。我没有对它进行过广泛的测试,但你可以看到它是如何工作的。

答案 3 :(得分: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

答案 4 :(得分:0)

假设linux并使用bash shell

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

答案 5 :(得分: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"
)

这不是太难,是吗?


P.S。:我们可以缩短一点,因为批处理文件语言有一个特殊的语法,当另一个命令成功时执行命令

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

我在左括号前加了一个@来抑制运行的命令的输出,否则你的屏幕会快速填满运行的命令。在批处理文件中,您通常只在第一行包含@echo off