簡體   English   中英

Shell腳本:檢查列表文件中目錄中是否存在文件

[英]Shell scripting: Check if file exists in directory from a list file

我正在嘗試檢查目錄中是否存在文本文件中列出的文件名。 如果medialab目錄中存在medialist.txt中的文件名,則將該文件名存儲在foundfiles.txt中,否則將該文件名存儲在lostfiles.txt中。 我遇到困難的地方是將一個文件名從medialist.txt傳遞到if語句中。 如何將單個文件名從medialist.txt傳遞給if語句?

到目前為止,下面的代碼塊是我提出的。

for i in $(cat /home/user/Downloads/medialab/medialist.txt)
do
   if [[ $([[ -e $i ]]) == $(ls /home/user/Downloads/medialab/)  ]]
   then
           echo "$i" > /home/user/foundfiles.txt
   else
           echo "$i" > /home/user/lostfiles.txt
   fi
done

我已經在if語句中嘗試了xargs命令。 這將替換上面的for循環中的當前if語句。 我將刪除LS變量,它僅用於測試if語句。 這是示例:

LS=$(ls /home/user/Downloads/medialab/)

if [[ -e $(xargs echo "$LS") ]]
then    
    echo "$i" > /home/user/foundfiles.txt
else    
    echo "$i" > /home/user/lostfiles.txt
fi

您可以僅在while循環中讀取文件,然后使用-f (檢查給定路徑是否為文件)開關來檢查路徑是否為文件,如下所示:

while read -r || [[ -n $REPLY ]]; do
    [[ -z $REPLY ]] && continue
    if [[ -f "/home/user/Downloads/medialab/${REPLY}" ]]; then
        echo "$REPLY" >> "/home/user/foundfiles.txt"
    else
        echo "$REPLY" >> "/home/user/lostfiles.txt"
    fi
done < "/home/user/Downloads/medialab/medialist.txt"

這里發生的是我們正在通過重定向到while循環來讀取輸入文件,使用read使用內置的$REPLY變量將輸入讀入變量,然后使用|| [[ -n $REPLY ]] || [[ -n $REPLY ]]處理不以換行符結尾的輸入文件。

接下來,我們使用-z檢查變量是否為空,這將處理文件中間的空行,並continue跳過它們。

然后,我們檢查現在填充的$REPLY變量中的字符串是否是帶有-f的文件(將文件名擴展為引號中路徑的一部分),並在適當的文件后附加>>

注意如何使用[[作為測試,您不需要引用LHS變量,但是需要引用RHS變量(以及幾乎所有其他用途的變量)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM