尋找不包含結束括號 ')' 的目錄

尋找不包含結束括號 ')' 的目錄

我試圖列出所有不以年份結尾的影片目錄(而不是文件),例如,(2015)更具體地說,沒有列出年份,因此不以右括號結尾)

我怎樣才能做與以下相反的事:

# List all files and directories end with '(2015)'
ls -ld *\(2015\)

# List all files and directories end with ')'
ls -ld *\)

誰能幫助解釋如何做到這一點?

答案1

嘗試這個:

ls -ld *[^\)]

[] - 我們感興趣的字符集

^ - 否定(因此我們包含了不需要的字元集)

\) - 轉義 ')'

答案2

在 bash 或 zsh 中:

for i in *; do [ -d "$i" ] && [[ ! "$i" =~ \)$ ]] && printf "%s\n" "$i"; done

這將簡單地循環當前目錄中的所有文件和目錄,並檢查 i)它們是一個目錄(並且 ii)它們的名稱不以([ -d "$i" ])結尾。通過這兩個測試的項目將被打印。)[[ ! "$i" =~ \)$ ]]

這可以處理任意檔名(哪個ls不能)。

答案3

方法 1a:

ls -ld -- *[^\)]

(使用[…]路徑名擴展(通配符/全域)模式: [abc]匹配abc; [^abc]匹配除ab或 之外的任何內容c;因此[^\)]匹配除 之外的任何內容)。)

方法2a:

GLOBIGNORE="*)"
ls -ld -- *

非常不言自明嗎?

這兩種方法都會匹配檔案和其他不是目錄的物件。


根據 don_crissti 的建議進行更新,僅查找目錄:

方法 1b:

ls -ld -- *[^\)]/

方法2b:

GLOBIGNORE="*)/"
ls -ld -- */

請注意,您必須在值/中包含GLOBIGNORE

答案4

POSIXly:

find . ! -name . -prune -type d ! -name '*)'

zsh

print -rl -- *[^\)](/)

其他類似 Bourne 的 shell 無法過濾通配結果。您可以使用:

printf '%s\n' *[!\)]/

僅符合目錄。但它會在擴展結果中添加一個尾部斜杠。有了目錄foo,你就會得到foo/

相關內容