Find
Bash:一起使用“if”和“find”來檢查文件夾中的文件
我有一個父文件夾,裡面有一系列“histogram_0000_0000”文件夾。我正在嘗試製作一個 bash 腳本,該腳本在每個文件夾中搜尋文件“out.txt”,並在每次在文件夾中找到該文件時返回(以檢查該文件是否存在於所有文件夾中)。我得到的腳本是;
#!/bin/bash joblist='job_list.txt' njobs=`wc ${joblist} | awk '{print $1}'` cwd=`pwd` for ((i=1 ; i <= ${njobs} ; i++ )); do folder=`awk '(NR=='${i}'){print}' ${joblist}` echo $folder cd ${folder} if [ find -name "out.txt" ] then echo out.txt found in $folder fi cd ${cwd} done
但是每次執行時都會出錯;
./checkrun.sh: 第 10 行: [: -name: 期望二元運算符
我環顧四周,嘗試使用'
$$ [’ and ’ $$]’,但仍然不知道為什麼我有運氣!任何幫助都會很棒。謝謝,-傑克
[
…]
測試字元串或數字表達式。如果您想查看find
命令是否匹配,您需要測試它是否提供了任何輸出(非空字元串,用 測試-n
)。if [[ -n "$(find -name 'out.txt')" ]] then echo "out.txt found in $folder" fi
請注意,我使用現代
$(...)
語法來擷取命令的輸出,而不是不推薦使用的反引號...
。其他的建議,
- 您可以簡化
njobs=
wc ${joblist} | awk ‘{print $1}’`` withnjobs=$(wc -l <"$joblist")
來獲取行數。- 作為變數傳入
$i
,awk``folder=$(awk -v i="$i" 'NR==i {print}' "$joblist}")
- 不要
cd
到子文件夾,然後依靠 usingcd
回到原來的位置。要麼使用相對路徑來引用子目錄,要麼使用子外殼來保持cd
有限的上下文。在這裡,我使用了第一種方法echo "$folder" if [[ -n "$(find "$folder" -name 'out.txt')" ]] then echo "out.txt found in $folder" fi
- 如果
$folder
始終是相對路徑,則在任何用作“./$folder”的路徑的地方引用它。這可以防止它以破折號 (-
) 開頭,這可能會混淆可能試圖將其解釋為一系列選項的命令。bash
shell 已經有一個目前工作目錄的變數,所以你可以簡化cwd=
pwd``為cwd="$PWD"
- 使用https://shellcheck.net/檢查您的程式碼。(如果您擔心共享私有程式碼,或者在本地安裝它。)