2011-05-08 126 views
273

我試圖在我的bash(最新Ubuntu LTS發行版)目錄及其子目錄中查找具有特定擴展名的所有文件。遞歸查找具有特定擴展名的文件

這是什麼寫在一個腳本文件:

#!/bin/bash 

directory="/home/flip/Desktop" 
suffix="in" 

browsefolders() 
    for i in "$1"/*; 
    do 
    echo "dir :$directory" 
    echo "filename: $i" 
    # echo ${i#*.} 
    extension=`echo "$i" | cut -d'.' -f2` 
    echo "Erweiterung $extension" 
    if  [ -f "$i" ]; then   

     if [ $extension == $suffix ]; then 
      echo "$i ends with $in" 

     else 
      echo "$i does NOT end with $in" 
     fi 
    elif [ -d "$i" ]; then 
    browsefolders "$i" 
    fi 
    done 
} 
browsefolders "$directory" 

不幸的是,當我開始在終端這個腳本,它說:

[: 29: in: unexpected operator 

(與'in'$extension代替)

這是怎麼回事,錯誤在哪裏? 但這個大括號

+1

的錯誤是由缺少「{」 – shrewmouse 2014-11-20 14:11:44

+1

你可以標記一個答案是正確的? – 2017-12-14 09:04:09

回答

508
find $directory -type f -name "*.in" 

比整個事情(更安全 - 涉及的文件名和目錄名空格)短了一點。

您的腳本可能會因其名稱中沒有.的條目而失敗,從而使$extension爲空。

+0

這也是遞歸的嗎? – flip 2011-05-08 12:26:40

+5

是的,'find'默認是遞歸的。如果需要,可以限制深度(請參見手冊頁)。 – Mat 2011-05-08 12:27:13

+1

我想將所有找到的文件作爲參數傳遞給jar文件。這怎麼能被執行? – flip 2011-05-08 12:31:13

9
  1. 有一個{browsefolders()
  2. 所有$in失蹤應該是$suffix
  3. cut線讓你只front.middle.extension中間部分。您應該閱讀${varname%%pattern}和朋友的shell手冊。

我假設你這樣做是作爲shell腳本的練習,否則已經提出的find解決方案是要走的路。

要檢查正確的shell語法,而不運行腳本,請使用sh -n scriptname

51

我使用的語法比什麼@馬特建議有點不同:

find $directory -type f -name \*.in 

(它少了一個按鍵)。

+1

如果在當前目錄中有擴展名爲.in的文件,則Matt的腳本也不會工作,而您的工作仍然可用。看到http://stackoverflow.com/questions/5927369/recursively-look-for-files-with-a-specific-extension#comment22990599_5927391 – Shnatsel 2013-04-19 09:25:56

+4

@Shnatsel這個評論(因此你的)是明顯錯誤的。 – 2015-02-19 12:46:59

+1

@gniourf_gniourf您應該爲您的陳述提供一些參考,否則可以簡單地爭辯:「不,你錯了」。但實際上你是對的:https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html – Murmel 2016-06-14 08:46:53

71
find {directory} -type f -name '*.extension' 

例如 尋找當前目錄中的所有CSV文件

find . -type f -name '*.csv' 
5

要找到所有的pom.xml文件在當前目錄中,並打印出來,你可以使用:

find . -name 'pom.xml' -print 
-1
find $directory -type f -name "*.in"|grep $substring 
9

不使用find

du -a $directory | awk '{print $2}' | grep '\.in$' 
+3

'grep'在這裏並不是真的需要。 'awk'具有正則表達式,並且可以將其輸出限制爲匹配模式的值。 – Kenster 2016-03-05 17:57:14

+0

如果你的數據量達到100兆字節,這種方法非常有用。查找命令需要太多時間來處理。這立即開始。 – Protonova 2017-02-11 00:59:11

+0

'awk | grep'是一種反模式。讓awk去做一下。 – Jens 2017-06-30 16:50:30

相關問題