Find

Bash:一起使用“if”和“find”來檢查文件夾中的文件

  • October 9, 2021

我有一個父文件夾,裡面有一系列“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")來獲取行數。
  • 作為變數傳入$iawk``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”的路徑的地方引用它。這可以防止它以破折號 ( -) 開頭,這可能會混淆可能試圖將其解釋為一系列選項的命令。
  • bashshell 已經有一個目前工作目錄的變數,所以你可以簡化cwd=pwd``為cwd="$PWD"
  • 使用https://shellcheck.net/檢查您的程式碼。(如果您擔心共享私有程式碼,或者在本地安裝它。)

引用自:https://unix.stackexchange.com/questions/650420