2014-11-21 50 views
0

我有一個關於使用shell來讀取文件的問題。也就是說,我有這樣的文件夾:文件名前綴測試總是在bash中失敗

文件夾

  • new_file.log(這是一個文件)
  • new_file2.log(這是一個文件)
  • new_file3.log (這是一個文件)
  • 新的(這是一個子文件夾)
    • 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

不要** EVER **在腳本中使用'ls'。請參閱http://mywiki.wooledge.org/ParsingLs – 2014-11-21 01:22:19

+0

...如果您想讓*中的文件迭代隱藏文件,'shopt -s dotglob'會產生這種效果。 – 2014-11-21 01:23:42

+2

...另外,在shell中使用'=='不是一個特別好的習慣,除了在數學上下文中; POSIX指定'='作爲'test'的非數字相等運算符;支持'=='的炮彈是作爲非標準規定的擴展。它不像'[[]]'中的練習那麼糟糕,因爲它無論如何都不是POSIX,但手指記憶將(安全)'[[$ foo == $ bar]]'轉換爲(不安全) )''「$ foo」==「$ bar」]'或'test「$ foo」==「$ bar」',這兩者都需要'='以便攜帶。 – 2014-11-21 01:25:49

回答

2

[[ $foo = $bar ]]是一個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) 
+0

感謝您提供豐富的信息。 – 2014-11-21 01:41:42

2

你的方向沿着錯誤的軌道。以下是如何迭代所有以new開始的常規文件:

for file in new* 
do 
    if [[ -f $file ]] 
    then 
    dosomething "$file" 
    fi 
done