遍历目录,检查一个文件中是否存在字符串,移动另一个文件

时间:2015-05-22 21:54:16

标签: bash grep

我正在开发一个应该执行以下操作的bash脚本:对于每个以Event_ *开头的目录(在cat eventList中),cd进入目录,如果文件中存在字符串“ZJ.ROT”* .mcp,我想将文件“ROT”复制到另一个目录。简单来说:循环目录:如果该目录中的文件中存在字符串“ZJ.ROT”,则将该目录中的另一个文件输出到单独的目录。

#!/bin/bash

mkdir newdire
for dir in `cat eventList`; do
cd $dir
pwd
if grep "ZJ.KNYN" *.mcp; then
cp "ROT" "newdire"
fi
done

我得到的错误是:

./azim.sh: line 5: cd: Event_2014.11.21.10.10.19.630: No such file or directory
/Users/files/Event_2013.12.01.06.29.57.800
grep: *.mcp: No such file or directory

出于某种原因,这个for循环不会循环遍历每个目录,但它停留在第一个目录Event_2013 ....有关如何实现此代码的任何想法?

2 个答案:

答案 0 :(得分:2)

第一次cd到一个子目录后,您将进入所有未来的循环迭代,因此您的后续cds将会失败,正如您所遇到的那样。您还需要引用变量以及其他问题。试试这个:

pwd="$PWD"
mkdir newdire
while IFS= read -r dir; do
    cd "$dir"
    grep -Fq "ZJ.KNYN" *.mcp &&
    cp "ROT" "${pwd}/newdire"
    cd "$pwd"
done < eventList

但当然你实际上并不需要cd:

mkdir newdire
while IFS= read -r dir; do
    grep -Fq "ZJ.KNYN" "$dir"/*.mcp &&
    cp "${dir}/ROT" newdire
done < eventList

答案 1 :(得分:0)

问题似乎在这里:

var mix = {};
mix.elems = [];
$(".productsearch").each(function (i) {
        var input = $(this);
        mix.index = i;
        mix.elems[i] = { quantity: input.data("quantity"), um: input.data("um"), search: input.data("search") }
    });

您应该在if grep "ZJ.KNYN" *.mcp; then 中使用-q选项来取消输出并检查返回状态,如下所示:

grep

if grep -qF "ZJ.KNYN" *.mcp; then 用于固定字符串搜索。

此外,无需更改循环内的目录。

您的完整脚本可以更好地重写为:

-F