![尋找不包含結束括號 ')' 的目錄](https://rvso.com/image/83705/%E5%B0%8B%E6%89%BE%E4%B8%8D%E5%8C%85%E5%90%AB%E7%B5%90%E6%9D%9F%E6%8B%AC%E8%99%9F%20')'%20%E7%9A%84%E7%9B%AE%E9%8C%84.png)
我試圖列出所有不以年份結尾的影片目錄(而不是文件),例如,(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]
匹配a
、b
或c
;
[^abc]
匹配除a
、b
或 之外的任何內容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/
。