Bash

刪除包含特定文件的目錄,但以“!”開頭的目錄除外

  • January 17, 2022

我正在嘗試按照標題所述進行操作。當我的儲存空間不足時,我有一個帶有每日輪播電影列表的伺服器。我有一個腳本可以通過並刪除最舊的 .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 中工作,即*[^\!]*


注意:您的標題是指以*“!”開頭的目錄* 但在文本中你提到包含“!”的目錄 . 我假設後一種情況,但如果你只想排除前者,那麼*從全域中刪除前導。

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