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

Loop through directories, check if string exists in one file, move another file

我正在编写一个 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。...关于如何实现此代码的任何想法?

问题似乎出在这里:

if grep "ZJ.KNYN" *.mcp; then

您应该使用 grep 中的 -q 选项来抑制输出并检查 return 状态,如下所示:

if grep -qF "ZJ.KNYN" *.mcp; then

-F 用于固定字符串搜索。

也不需要在循环内改变目录。

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

#!/bin/bash

mkdir newdire

for dir in Event_*; do
   if [[ -d "$dir" ]] && grep -qF "ZJ.KNYN" "$dir"/*.mcp 2>/dev/null; then
      cp "$dir/ROT" "newdire/"
   fi
done

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

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