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循环[重复]的主要内容,如果未能解决你的问题,请参考以下文章