2017-01-23 131 views
1

我正在致電scp來下載遠程系統上存在的文件夾。下載文件夾有子文件夾和這些子文件夾內有文件的一羣,我想作爲參數傳遞給一個Python腳本是這樣的:如何遞歸遍歷目錄樹並僅查找文件?

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進行查找:使用所有控制字符打印文件名&以NUL結尾,然後是read具有相同除限制字符的命令進程。

注意;在附註中,請始終在bash中雙引號變量以避免shell的擴展。

+0

爲什麼要用'while' /'read'循環解析find'(和使用非標準功能)的'輸出,而不是使用'find'的'-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

如果設置,模式 '**' 在一個文件名擴展上下文中使用會 匹配所有文件和零個或多個目錄和子目錄。如果 該模式後面跟有'/',則只有目錄和子目錄 匹配。

更多globstar這裏的討論:https://unix.stackexchange.com/questions/117826/bash-globstar-matching