2017-08-21 6 views
0

データのベースディレクトリを再帰的に実行し、その中の各ファイルを変更し、別のベースディレクトリに新しいファイルを作成します。だから私は2つの引数が必要です、1つはオリジナルのデータベースディレクトリのパス、もう1つは新しいファイルを置くベースディレクトリです。しかし、私のコードには何か問題があります。私はこれらの2つの引数を端末に入力するのではなく、main関数の下に置いています。誰かが私を助けることを願います。なぜこのbashスクリプトを再帰的に実行できないのですか?

以下は、私のコードです:


function traverse() { 
    for file in $(ls "${data_path}") 
    do 
     echo "in file: ${data_path}/${file}" 
     if [[ ! -d ${data_path}/${file} ]]; then 

      if [[ ${data_path}/${file} == *.nii.gz ]];then 

       echo "is nifti: ${data_path}/${file} " 

      else 
     echo "not file" 
     echo ${data_path} 

     temp_path=${data_path/'/data2/Projects/Incoming_monkey'/} 
     new_path="${new_destination}/${temp_path}" 
     mkdir -p ${new_path} 
     echo ${new_path} 
     fi 
     else 
      echo "entering recursion with: ${data_path}/${file}" 
      traverse "${data_path}/${file}" "${new_destination}" 
     fi 
    done 
} 
function main() { 

    echo "main start" 

    data_path=/data2/Projects/Incoming_monkey/MAJOM/08_20170706/func 
    new_destination=/data2/Projects/reorientation 

    traverse "${data_path}" "${new_destination}" 
} 

main 

+1

コード/データに4つの空白を付けます。 [edit-help](http://stackoverflow.com/editing-help)を見てください。 – Cyrus

+1

グローバル変数は再帰の考え方を打ち消します。 –

答えて

0

私は、コードの背後にあるロジックを理由にしようとしていないが、私はいくつかの明白なエラーを表示することができます。変数data_pathnew_destinationがmain関数で作成されたのはグローバルなので、traverse関数でそれらを読むことができるのはこのためです。これを修正するために、メイン関数のローカルにするために、それらの前にdeclareキーワードを追加しました。また、これらの2つの変数をパラメータとしてtraverse関数に渡します。コードからは、これらの引数のいずれも読み取られません。これを修正するために、変数名を$ 1と$ 2に置き換えてparamsとして読みました。

編集:ローカルにする必要がある変数が見つかりました。 (temp_pathおよびnew_path

#!/bin/bash 

function traverse() { 
    for file in $(ls "${1}") # Replace data_path with 1 
    do 
     echo "in file: ${1}/${file}" 
     if [[ ! -d ${1}/${file} ]]; then 

      if [[ ${1}/${file} == *.nii.gz ]];then 

       echo "is nifti: ${1}/${file} " 

      else 
     echo "not file" 
     echo ${1} 

     declare temp_path=${1/'/data2/Projects/Incoming_monkey'/} 
     declare new_path="${2}/${temp_path}" # Replaced new_destination by 2 
     mkdir -p ${new_path} 
     echo ${new_path} 
     fi 
     else 
      echo "entering recursion with: ${1}/${file}" 
      traverse "${1}/${file}" "${2}" 
     fi 
    done 
} 
function main() { 

    echo "main start" 

    declare data_path=/data2/Projects/Incoming_monkey/MAJOM/08_20170706/func 
    declare new_destination=/data2/Projects/reorientation 

    traverse "${data_path}" "${new_destination}" 
} 

main 
+2

回答を投稿する場合は、 'for $(ls ...);のファイルを永続化しないでください。 – chepner

+0

変数にローカルスコープがあることを示すために 'local'がはるかに明確です。 –

関連する問題