【问题标题】:Scan directory continuously and perform operation连续扫描目录并执行操作
【发布时间】:2024-05-01 13:40:02
【问题描述】:

我有复杂的要求:

1)我需要连续扫描目录 1 并从 xml 列表中提取一个元素。

2)根据元素,检查文件(元素)是否存在于目录2中

3)如果存在则将 xml 文件复制到目录 2

4)继续这个循环

XML 示例:

<?xml Version="1.0" encoding="UTF-8" standalone="no"?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Main>
    <Rec>Bank</Rec>
  </Main>
  <Code>124</Code>
  <City></City>
  <CompCodes>
    <CompCode>US</CompCode>
    <Vend>13</Vend>
    <File_name>abc.txt</File_name>
  </CompCodes>
  <BankData>
    <Code>123</Code>
    <BankAcctNum>231</BankAcctNum>
  </BankData>
  <BankData>
    <Code>124</Code>
    <BankAcctNum>431</BankAcctNum>
  </BankData>
</Data>

我尝试使用下面的脚本,但它没有做它应该做的事情:

#!/usr/bin/env bash
dir_list1=(
/data/test/
)

search_for_files() {
        local dir=$(cd "$1"; pwd)
        local target=/data/test2/
        shopt -s nullglob
        for file in "$dir"/*xml; do
                pdf=$(grep -oPm1 "(?<=<File_name>)[^<]+" <<< "$file")
                #base=${file%.*}
                #base=${base##*/}
                if [-d "$target/$pdf" ]; then
                        cp $dir/$file  $target 
                fi
      done
}

for file in "${dir_list1[@]}"; do
        search_for_files "$dir"
done

感谢任何帮助!

【问题讨论】:

  • 尝试将代码粘贴到 shellcheck.net
  • [-d "$target/$pdf" ]如果是文件,应该使用[-f "$target/$pdf" ]
  • 有人称它为summoning the daemon,其他人称它为the Call for Cthulhu,很少有人称它为turned mad and met the Pony。简而言之,永远不要使用正则表达式解析 XML 或 HTML!您是否尝试过诸如 xmlstarletxmllintxsltproc 之类的 XML 解析器?

标签: linux bash shell unix


【解决方案1】:

脚本中有多个错误,以下是更正版本:
我已经注释掉了错误的行并将更正的行放在它们下面

#!/usr/bin/env bash
dir_list1=(
/data/test/
)

search_for_files() {
    local dir=$(cd "$1"; pwd)
    local target=/data/test2/
    shopt -s nullglob
    for file in "$dir"/*xml; do
            #pdf=$(grep -oPm1 "(?<=<File_name>)[^<]+" <<< "$file")
            pdf=$(grep -oPm1 "(?<=<File_name>)[^<]+" < "$file")
            #base=${file%.*}
            #base=${base##*/}
            #if [-d "$target/$pdf" ]; then
            if [ -f "$target/$pdf" ]; then
                    #cp $dir/$file  $target 
                    cp "$file" "$target" 
            fi
  done
}

#for file in "${dir_list1[@]}"; do
for dir in "${dir_list1[@]}"; do
    search_for_files "$dir"
done

为了满足您的要求 #1(“连续扫描目录 1”),您可以查看工具“watch”。

【讨论】: