【问题标题】:For loop in bash [duplicate]bash中的for循环[重复]
【发布时间】:2019-04-09 02:03:09
【问题描述】:

我正在尝试编写一个 bash 脚本,它递归地遍历目录中的文件,将文件名和 hexdump 写入文件。我当前的脚本:

#/bin/sh
touch hexdump.txt
for filename in logical/*; do
    echo "$filename"
    "$filename" >> hexdump.txt
    hd /logical/"$filename" >> hexdump.txt
done

当前输出为:

logical/*
./hexadecimalExtraction.sh: line 5: logical/*: No such file or directory
hd: /logical/logical/*: No such file or directory

我如何让它将“逻辑/*”解释为“逻辑”目录中的文件列表而不是文件名本身???

【问题讨论】:

  • 看起来您的logical/ 目录是空的。 printf '%s\n' logical/* 说什么?
  • 这个“逻辑”目录在哪里?logical/* 将在当前工作目录下查找它(以及其中的文件),但对于/logical,前导的“/”将使其成为而是查看文件系统的顶层。区别很重要。
  • 在做之后添加一个[[ -f "$filename" ]] || continue,也许吧?
  • 同样,如果您找到logical/fileX,您对hd 的调用将尝试对/logical/logical/fileX 进行操作。这是你的意图吗?

标签: linux bash


【解决方案1】:
"$filename" >> hexdump.txt

应该被删除

否则,您将尝试运行文件名本身。

您也在当前目录的逻辑子目录中查找文件,但试图在 /logical/ 中查找

【讨论】:

    【解决方案2】:

    您不能使用for filename in logical/* 进行递归。为了递归,你必须使用find。 要查找只访问文件而不是目录,请使用find -type f。 我不知道高清,但你可能想要

    find tutorials -type f | while read i; do
        echo $i >> hexdump.txt
        hd $i >> hexdump.txt
    done
    

    【讨论】:

    • ...您必须使用find 或在每个目录上调用自身的递归函数。
    【解决方案3】:

    您正在寻找** glob 运算符。

    shopt -s globstar nullglob
    for filename in logical/**/*; do
        echo "$filename"
        hd "$filename"
    done >> hexdump.txt
    

    filename 将包含匹配文件的全名,其中已包含目录logical 和任何子目录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-09
      • 2021-03-02
      • 2020-01-06
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 2015-08-24
      相关资源
      最近更新 更多