我需要撰寫一個 Bash 腳本來檢查路徑中是否有任何新檔案夾,如果是,則執行某些操作,如果沒有,則只需退出。
我的想法是創建一個文本檔案來跟蹤所有舊檔案夾并進行比較,如果有新內容則執行操作。請幫助我實作這一目標:
我嘗試使用兩個檔案跟蹤,但我認為我做對了。
該/tmp/檔案夾有多個子檔案夾
#/bin/sh
BASEDIR=/tmp/
cd $BASEDIR
ls -A $BASEDIR >> newfiles.txt
DIRDIFF=$(diff oldfiles.txt newfiles.txt | cut -f 2 -d "")
for file in $DIRDIFF
do
if [ -e $BASEDIR/$file ]
then echo $file
fi
done
uj5u.com熱心網友回復:
一般不要ls在腳本中使用。這是一個避免它的簡單重構。
#!/bin/sh
printf '%s\n' /tmp/.[!.]* /tmp/* >newfiles.txt
if cmp -13 oldfiles.txt newfiles.txt | grep .; then
rc=0
rm newfiles.txt
else
rc=$?
mv newfiles.txt oldfiles.txt
fi
exit "$rc"
使用comm而不是在diff某種程度上簡化了處理(通配符應該按排序順序擴展檔案,因此將滿足排序輸入的要求)并且將檔案保存在當前目錄中(而不是 in /tmp)應該避免腳本觸發本身。的輸出comm將是新檔案,因此無需進一步處理。在grep .檢查是否有任何輸出線,這樣我們就可以設定退出狀態,以反映是否有新的條目。
您的腳本查找檔案,而不是目錄。如果您真的要查找新目錄,請在每個通配符運算式后添加一個斜杠:
printf '%s\n' /tmp/.[!.]*/ /tmp/*/ >newfiles.txt
如果現有檔案或目錄被修改,這不會通知。inotifywait如果您需要更復雜的東西(或者即使這就是您所需要的),可能會切換到。
uj5u.com熱心網友回復:
假設您只對子目錄感興趣。我們也假設您沒有包含換行符的目錄名稱。
不要處理ls輸出,它僅供人類使用。喜歡find。然后,簡單地用 對舊串列和新串列進行排序sort并與它們進行比較comm,只保留在新串列中找到的行而不是舊串列中的行(man comm將告訴您為什么該-13選項會這樣做)。在下面的do something is just echo,替換為任何需要的:
#!/bin/sh
BASEDIR=/tmp/
cd "$BASEDIR"
find . -type d | sort > new.txt
if [ -f old.txt ]; then
comm -13 old.txt new.txt | while IFS= read -r name; do
echo "$name"
done
fi
mv new.txt old.txt
這將探索起點下的完整層次結構,并考慮任何目錄。如果您不想探索起點下的完整層次結構,而只想探索當前級別:
find . -maxdepth 1 -type d | sort > new.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/323980.html
標籤:猛击
下一篇:關于ls輸出和雙引號的簡單問題
