我有一个关于使用shell来读取文件的问题。也就是说,我有一个像这样的文件夹:
文件夹
我想要的是从(直接)文件中读取所有内容,而不是从子文件夹中读取文件。在上面的例子中,我需要new_file.log到new_file3.log。
我知道有一个简单的方法:
$ cat new*.log
但我也想写一个bash脚本:
for file in $(ls -a)
do
if [[ "$file" != "." && "$file" != ".." ]]; then
if [[ -f "$file" && "$file" == "^new" ]]; then **here is the problem**
[do something]
fi
fi
done
我的问题标记如上。 bash代码似乎不喜欢
"$file" == ^new
如果我运行bash,它基本上什么都不做,这意味着文件无法满足条件。 有什么不对吗?
答案 0 :(得分:2)
[[ $foo = $bar ]]
是一个glob表达式,而不是正则表达式; ^
在那里没有特别的意义。
你可能想要一个glob表达式
[[ $file = new* ]]
或正则表达式
[[ $file =~ ^new ]]
当然,在实际情况中,您只需迭代与您的前缀匹配的名称:
for file in new*; do
: something with "$file"
done
...或者,递归地(使用FD 3,这样你仍然可以在这段代码中与用户交互):
while IFS= read -u 3 -r -d '' file; do
: something with "$file"
done 3< <(find . -type f -name 'new*' -print0)
答案 1 :(得分:2)
你走错了路。以下是如何迭代以new
开头的所有常规文件:
for file in new*
do
if [[ -f $file ]]
then
dosomething "$file"
fi
done