刪除包含特定文件的目錄,但以“!”開頭的目錄除外
我正在嘗試按照標題所述進行操作。當我的儲存空間不足時,我有一個帶有每日輪播電影列表的伺服器。我有一個腳本可以通過並刪除最舊的 .mp4。我留下了與那部電影相關的剩余文件,只是佔用了空間。我想刪除整個文件夾。
目前這是我的程式碼:
#Finds oldest *.mp4 and deletes it. stat --printf='%Y %n\0' "$dir"/New_Movies/*/*.mp4 | sort -z | sed -zn '1s/[^ ]\{1,\} //p' | xargs -0 rm
以下是我在查找不包含 *.mp4 也沒有“!”的目錄時失敗的嘗試 在目錄名稱中。範例名稱:“!Action”。
for d in "$dir"/New_Movies/*/; do if ! [ -e "*!*" ]; then [ -f "$d"*.mp4 ] || printf '%s\n' "$d" fi done
在測試時,我得到 3 種不同的輸出,每次執行時都有一種。
執行 1:它為我提供了正確的目錄以及包含“!”的所有目錄 (它們是快捷方式,所以我認為它們看起來是空的)。
執行 2:與上面相同,但每個 printf 之間有很多“-bash: [: too many arguments”。
執行 3:中斷程式碼並且不執行。
之後:從執行 1 到 3 依次重複。
目錄範例:
/New_Movies/
/New_Movies/*/index.php
/New_Movies/foo/foo.mp4, foo.jpg, foo.xml
/New_Movies/bar/bar.jpg, bar.xml
執行腳本後,我應該只剩下 /New_Movies/foo 及其內容。
在預設情況下禁用歷史擴展的腳本內部,您應該能夠使用簡單的 shell glob
!
匹配名稱不包含的目錄:要麼或(其中第一個是 POSIX 否定)。!``*[^!]*``*[!!]*``!
有幾種方法可以測試“不包含 *.mp4 的目錄”條件;想到的一個是使用另一個帶有
set
內置 shell 的 glob,並測試結果的 positional parameters 數量$#
。把它放在一起:
#!/bin/bash shopt -s nullglob for d in ./*[^!]*/; do set -- "$d"/*.mp4 if [ $# -eq 0 ]; then printf '%s\n' "$d" fi done
!
如果您禁用歷史擴展或轉義th glob 中的字元,則此方法應在互動式 shell 中工作,即*[^\!]*
注意:您的標題是指以*“!”開頭的目錄* 但在文本中你提到包含“!”的目錄 . 我假設後一種情況,但如果你只想排除前者,那麼
*
從全域中刪除前導。