2016-06-22 5 views
0

많은 하위 디렉토리에 많은 파일이 있습니다.Bash : 재귀 적으로 하위 디렉토리 다시 만들기

나는 그들에게 몇 가지 작업을 수행하고 결과를 새로운 파일로 반환하고 싶지만 입력과 완전히 동일한 하위 디렉토리가있는 출력 디렉토리에 결과를 반환하고 싶습니다.

나는 이미 시도 :

#!/bin/bash 

######################################################## 

# $1 = "../benchmarks/k" 
# $2 = Output Folder; 
# $3 = Path to access the solver 

InputFolder=$1; 
OutputFolder=$2; 

Solver=$3 

mkdir -p $2; 

######################################## 
# 
# Send the command on the cluster 
# to run the solver on the instancee. 
# 
######################################## 
solveInstance() { 

    instance=$1; 

# $3 $instance > $2/$i.out 
} 

######################################## 
# 
# Loop on benchmarks folders recursively 
# 
######################################## 
loop_folder_recurse() { 

    for i in "$1"/*; 
    do 
     if [ -d "$i" ]; then 

      echo "dir: $i" 

      mkdir -p "$2/$i"; 

      loop_folder_recurse "$i" 

     elif [ -f "$i" ]; then 

      solveInstance "$i" 

     fi 

    done 
} 

######################################## 
# 
# Main of the Bash script. 
# 
######################################## 

echo "Dir: $1"; 

loop_folder_recurse $1 

######################################################## 

문제는 내 라인 mkdir -p "$2/$i";입니다. $2은 처음에 만들 디렉토리의 이름이므로 아무런 문제가 없습니다. 그러나 $i에서는 절대 경로가 될 수 있으며이 경우 파일에 도착하기 위해 모든 하위 디렉토리를 만들려고합니다. 불가능합니다. 아니면이 .. 나타 문제의 같은 종류의 ...이 버그를 수정하는 방법을 정확히 모르는

을 포함 할 수 있습니다/I는 sed과 함께 몇 가지를 시도하지만 성공하지 못했습니다 :/

+0

'find -exec' 사용을 고려해보십시오. –

+0

'../../../dir1'과 같은 경로를'$ i'에'dir1'을 사용하여 정확히 만들고 싶다면 – Inian

+0

이 내 문제입니다. 나는 $ ouput/dir1/ –

답변

1

가장 쉬운 방법은 을 찾아 사용하는 것입니다 : 같은 방법으로

for i in `find $1 -type d` # Finds all the subfolders and loop. 
do 
    mkdir ${i/$1/$2} # Replaces the root with the new root and creates the dir. 
done 

당신은 $ 2에서 $ 1 폴더 구조를 다시 만듭니다. sed을 사용하여 이전 폴더 경로를 새 경로로 바꾸면 루프를 피할 수도 있습니다.

+0

'for in $ (command substitution)'을 사용하지 마십시오. [Bash Pitfall # 1] (http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29)를 참조하십시오. – andlrc

관련 문제