【问题标题】:Loop over find result in bash在bash中循环查找结果
【发布时间】:2021-10-04 10:06:12
【问题描述】:

我有一个 bash 脚本,由我公司的某个前同事编写。它的 shellcheck 结果很糟糕,使用 zsh 的我无法运行该脚本。他似乎在 bash 中使用了臭名昭著的 find 和 for loop thingy。但我不知道如何让它变得更好。

目前我得到了一个临时修复。

这是他的密码

#!/bin/bash

  releases=$(for d in $(find ${DELIVERIES} -maxdepth 1 -type d -name "*_delivery_33_SR*" | sort) ; do echo ${d##*_} ; done)
  
  
  for sr in ${releases[@]}
  do
         echo "Release $sr"
         deliveries=$(find ${deliveries_path}/*${sr}/ -type f -name "*.ear" -o -name "*.war" | sort)
         if [ ! -e ${sr}.txt ]
         then
                 for d in ${deliveries[@]}
                 do
                         echo "$(basename $d)" | tee -a ${sr}.txt
                 done
         fi
         echo
  done

这是我的代码,甚至可以循环第一部分。

#!/bin/bash
                                                                                                                                                             
  for release in $(for d in $(find "${DELIVERIES}" -maxdepth 1 -type d -name "*_delivery_33_SR*" | sort) ; do echo "${d##*_}" ; done)
  do                                                                                                                                 
    echo "Release $release"                                   
  done

如您所见,我需要将 find 放入循环中,但无法将其保存在变量中,因为当我尝试循环时,它会尝试将 \n 放在任何地方,它就像一个元素?任何人都可以建议我应该如何解决这个问题,因为这位以前的同事经常使用这种查找搜索。

编辑:

脚本以特定名称访问每个文件夹,然后创建一个 X.X.X.txt 文件,其中 X 部分中的版本号。并将子文件夹内的文件名附加到 X.X.X.txt

【问题讨论】:

  • 如果您专门询问 Bash,为什么要将此标记为 zsh
  • 如果不知道它应该处理的目录及其内容的含义,我们可能比您理解的还要少。您能否请edit 澄清脚本应该做什么?
  • 它应该返回一个版本中更改的“模块、文件”列表,这是我拥有的最好的文档。
  • 我们无法猜测这些目录包含哪些文件或它们是如何组织的。
  • @TaaviAnsper:真正可怕的是——特别是如果你被 zsh 修饰——脚本不太关心分词。在 zsh 中,当您有 ${deliveries_path} 时,您知道这是一个参数。在 bash 中,这会进行分词,这意味着代码会中断 fi deliveries_path 包含一个空格。但是这么小的脚本,你为什么不在zsh中从头重写呢,因为你更熟悉zsh而不是bash?

标签: bash shell find zsh


【解决方案1】:

盲目重构让我得到类似的东西

#!/bin/bash

for d in "$DELIVERIES"/*_delivery_33_SR*/; do
    sr=${d##*_}
    echo "Release $sr"
    if [ ! -e "${sr}.txt" ]
    then
        find "${deliveries_path}"/*"${sr}"/ -type f -name "*.ear" -o -name "*.war" |
        sort |
        xargs -n 1 basename |
        tee -a "$sr.txt"
    fi
    echo
done

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多