2017-01-23 1 views
1

scp 전화로 원격 시스템에있는 폴더를 다운로드하려고합니다. 다운로드 폴더에 하위 폴더가 있고 이러한 하위 폴더 내에서이 같은 파이썬 스크립트에 인수로 전달하려는 파일의 무리가 있습니다 : 거기에 어떤 디렉토리가 그들을 제외하면 찾기 위해 나는 논리를 추가 한재귀 적으로 디렉토리 트리를 탐색하여 파일 만 찾는 방법?

scp -r [email protected]:SomeName/SomeNameElse/$folder_name/ $folder_name/ 
echo "File downloaded successfully" 
echo "Running BD scanner" 
for d in $folder_name/*; do 
     if [[ -d $d ]]; then 
       echo "It is a directory" 
     elif [[ -f $d ]]; then 
       echo "It is a file" 
       echo "Running the scanner :" 
       python bd_scanner_new.py /home/nsadmin/Some/bash_script_run_files/$d 
     else 
       echo "$d is invalid file" 
       exit 1 
     fi 
done 

은 . 그러나, 나는 그 디렉토리를 재귀 적으로 탐색하지 않는다. 아래

일부 결과는 : 그것은 모든 디렉토리를 통과하고 모든 파일을 집어 수 있도록

File downloaded succesfully 
Running BD scanner 
It is a directory 
It is a directory 
It is a directory 
Exiting 

이 코드를 개선하고자합니다. 어떤 제안이라도 도와주세요.

답변

1

왜 파일 일치를 위해 globbing을 사용하는 대신에 find을 사용하는 것은 while 루프와 함께 프로세스 대체 (<())를 사용하여 이것을 의미합니다. 여기

#!/bin/bash 

while IFS= read -r -d '' file; do 
    # single filename is in $file 
    python bd_scanner_new.py "$file" 
done < <(find "$folder_name" -type f -print0) 

find 아래의 하위 디렉토리의 모든 수준에 대한 언급 경로에서 모든 파일의 재귀 검색을 수행합니다. 파일 이름은 공백, 탭, 공백, 개행을 포함 할 수 있습니다. 안전한 방법으로 파일 이름을 처리하려면 -print0이 사용됩니다. filename은 모든 제어 문자 &이 NUL로 끝나고 다음에 read 같은 de-limit 문자가있는 명령 프로세스로 인쇄됩니다.

참고; 부수적으로, 셸로 확장하지 않으려면 항상 bash의 변수를 이중 따옴표로 묶으십시오.

+0

왜 대신'find' 년대를 사용하는 find' (비 표준 기능을 사용하여)'의 출력을 구문 분석하는'while'가 /'read' 루프를 사용하여 '-exec' 스위치? ':)'. –

2

당신은 4.0 배쉬에서 shopt -s globstar를 사용할 수 있습니다

#!/bin/bash 

shopt -s globstar nullglob 
cd _your_base_dir 
for file in **/*; do 
    # will loop for all the regular files across the entire tree 
    # files with white spaces or other special characters are gracefully handled 
    python bd_scanner_new.py "$file" 
done 

배쉬 설명서 이것에 대해 globstar 말한다 : 파일 이름 확장 문맥에서 사용

설정된 경우, 패턴 '**'를합니다 모든 파일과 0 개 이상의 디렉토리와 하위 디렉토리를 찾습니다. 패턴 뒤에 '/'가 오는 경우, 디렉토리와 하위 디렉토리 만 일치합니다.

더 여기 globstar 토론 : https://unix.stackexchange.com/questions/117826/bash-globstar-matching

관련 문제