如何列出使用unix在文件夹中找不到的字符串

时间:2016-02-11 16:07:42

标签: perl unix

我在文本文件中有一个字符串列表。源文件夹包含一些包含字符串的文件。如果在源文件夹中找到一个字符串,我将其复制到目标文件夹。

srcdirectory - 检查字符串是否存在的源目录 stringList.txt - 要测试的字符串列表 目标 - 将找到的字符串复制到此文件夹。

例如,
srcdirectory 包含文件:

a.edi (contains string 'a' in the content of the file)                                                                                      
b.edi (contains string 'b' in the content of the file)                   
c.edi (contains string 'c' in the content of the file)                                                                                                                                                                                                                                                                                      
d.edi (contains string 'd' in the content of the file)                        
e.edi (contains string 'e' in the content of the file)   
f.edi (contains string 'f' in the content of the file) 
g.edi (contains string 'g' in the content of the file

stringList.txt 有字符串:

a              
b      
c           
d           
e
f
g

如果找到该字符串的匹配项,则会将匹配的文件名复制到目标文件夹。因此目标文件夹包含匹配的文件名:

 a.edi            
 c.edi           
 g.edi

现在,我希望将不匹配的字符串列表复制到下面的不同文件夹中。我该怎么做?

    b
    d
    e
    f

以下是匹配字符串的脚本:

find srcdirectory/ -maxdepth 2 -type f -exec grep -Ril -f stringList.txt {} \; -exec cp -i {} /home/Rose/target \;

任何帮助将不胜感激..

1 个答案:

答案 0 :(得分:1)

通常,您可以使用find运算符在-o中执行反向操作:

find srcdirectory -maxdepth 2 -type f \( \
    -exec grep -qif stringList.txt {} \; -exec cp -i {} /home/Rani/target \; \
     \) -o -exec cp -i {} /home/Rani/nonmatches \;

这里的诀窍是带括号的表达式必须是" true" (成功/ 0退出状态)匹配的文件,否则为false。如果匹配文件的cp -i失败,这将是不精确的。如果您有可能担心,则需要捕获grep -q的状态并在cp表达式后重新应用它。

或许它更容易陷入bash。

find srcdirectory -maxdepth 2 -type f -exec bash -c '
    for file; do
        if grep -qif stringList.txt "$file"; then
            cp -i "$file" /home/Rani/target
        else
            cp -i "$file" /home/Rani/nonmatches
        fi
    done
' _ {} +