bash中的for循环[重复]

Posted

技术标签:

【中文标题】bash中的for循环[重复]【英文标题】:For loop in bash [duplicate] 【发布时间】: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 进行操作。这是你的意图吗? 【参考方案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 和任何子目录。

【讨论】:

以上是关于bash中的for循环[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用for循环将文本文件中的一行字符串作为Bash中另一个脚本的单独变量传递[重复]

使用for循环bash脚本逐行读取文件[重复]

如何在bash for循环中使用变量[重复]

for循环子命令中的bash变量扩展[重复]

bash for循环:一系列数字[重复]

[Linux Shell学习系列七]Bash循环——1for循环