2010-01-06 76 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