2016-08-11 42 views
1

私はbashシェルを勉強していますが、最近私はファイル検索を含む再帰呼び出しを取得していないことを理解しています - これについてはfindが行われていますが、方法または別の。bashファイルをディレクトリに再帰的に見つける

#!/bin/bash 


function rec_search { 
for file in `ls $1`; do 
echo ${1}/${item} 
if[[ -d $item ]]; then 
rec ${1}/${item} 
fi 
done 
} 

rec $1 

スクリプトは、引数ファイルとして取得し、再帰的にそれを探して:

は、私は次のスクリプトを書きました。 私はそれが私の貧しい解決策を見つける。そして、いくつかの改善の質問がある:

  1. 自分の名前にスペースを含むファイル
  2. iが効率的に絶対アドレスをプリントアウトするためにpwdコマンドを使用することができます見つける方法(私はそうしようとしたが、失敗した)
  3. 他のすべてのコード
+1

[ 'ls'を使用しないでください!](http://mywiki.wooledge.org/ParsingLs) – Biffen

+0

@Inian' find'は、組み込みコマンドの任意*シェル*ではありません。 – chepner

+0

@chepner: 'GNU findutils'だと約束しました – Inian

答えて

3

の合理的な改善あなたのスクリプトは、現在動作しないことができます。

  • 関数はとして定義されますが、あなたが誤ってあなたはそれにいくつかの他の深刻な問題があまりにもありますif[[

での「if」の後にスペースを配置する必要がありrec

  • 呼び出す思われます。

    • for file in `ls $1` あなたはの身体をインデントする必要があり
    • スペースや他の空白文字とパスのために動作しません、「lsの出力を解析することはありません」する勧告に反しますとforは、それが簡単に

    を読むために作るためのスクリプトは次のように固定することができます

    rec() { 
        for path; do 
         echo "$path" 
         if [[ -d "$path" ]]; then 
          rec "$path"/* 
         fi 
        done 
    } 
    

    しかし、それは、車輪の再発明し、代わりにfindコマンドを使用しないことをお勧めします。

  • +0

    あなたの時間に感謝します!私はいくつかの重要な結論を出しました! –

    0

    bash 4以降(これはMac OS Xで実行していない場合が多い)を使用している場合は、**演算子を使用できます。

    rec() { 
        shopt -s globstar 
        for file in "$1"/**/*; do 
        echo "$file" 
        done 
    } 
    
    関連する問題