文件名前缀测试总是在bash中失败

时间:2014-11-21 01:19:17

标签: bash

我有一个关于使用shell来读取文件的问题。也就是说,我有一个像这样的文件夹:

文件夹

  • new_file.log(这是一个文件)
  • new_file2.log(这是一个文件)
  • new_file3.log(这是一个文件)
  • new(这是一个子文件夹)
    • new_file_from_subfolder.log
    • new_file2_from_subfolder.log
    • new_file3_from_subfolder.log

我想要的是从(直接)文件中读取所有内容,而不是从子文件夹中读取文件。在上面的例子中,我需要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,它基本上什么都不做,这意味着文件无法满足条件。 有什么不对吗?

2 个答案:

答案 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