![](/img/trans.png)
[英]Check latest file updates in directory on linux using bash shell scripting
[英]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.