Linux
如何將這三個查找命令合二為一?
我喜歡擁有我可能想要一個鍵綁定的每個文件。目前,我有一個帶有這三個查找命令的 shell 腳本,這些命令通過管道傳輸到 fzf。但由於多種原因,我需要將它們組合成一個命令(尤其是因為我目前的方法很醜陋,而且我肯定有缺陷)。
find ~ \! \( -path */.git/* \) -type d find ~ \( -iname \*.Rmd -o -iname \*.el \) -a \! \( -iname index.txt -o -path */.thunderbird/* -o -path */python3.8/* -o -path */.git/* \) -type f find ~ -regextype posix-extended \( -not -regex ".*/\.sw(o|p)" -a -not -regex ".*\~$" \) -maxdepth 1 -type f
如果有人想批評我醜陋的 find 命令並提出一種更有效/更乾淨的白名單/黑名單文件副檔名的方法——我將不勝感激。
編輯 我已經簡化了命令,以便更容易理解它們的功能。
- 第一個命令在主路徑下查找目錄,
~
但不包括.git
目錄及其子目錄。- 第二個命令在指定白名單文件副檔名的主目錄中查找文件,然後將文件副檔名和路徑列入黑名單。
- 第三個在我的主目錄中找到點文件,
~
但不包括某些正則表達式。
也許:
LC_ALL=C find ~/. \ '(' \ -name .git -o \ -name .thunderbird -o \ -name python3.8 \ ')' -prune -o \ '(' \ -type d -o \ '(' \ -name '*.[rR][mM][dD]' -o \ -name '*.[eE][lL]' -o \ ! -path '*/./*/*' \ ! -name '.sw[op]' \ ! -name '*~' \ ')' \ -type f \ ')' -print
(這裡使用標準
find
語法(避免使用-regex
,-regex-type
,-iname
,-maxdepth
,-not
,-maxdepth
它們都是 GNU 擴展))。請注意,
-prune
將全域跳過所有.git
//目錄,.thunderbird
甚至不會同時查看它們。與仍然列印和目錄以及在其中找到的目錄的第一個命令相比,這將有所不同。python3.8``find``find``.thunderbird``python3.8
為了能夠報告深度 1 的文件(與
-maxdepth 1
您的第三個命令一樣),我們附加/.
到搜尋目錄,並排除路徑匹配的文件*/./*/*
(低於 2 級以上/./
)。然而,這意味著路徑將列印為/home/you/./file.txt
. 如果你不喜歡這樣/./
,你總是可以通過管道輸出來擺脫它| sed 's|/\./||;1s|/\.$//'
。請注意,您
! -iname index.txt
是多餘的,因為無論如何index.txt
都不匹配。您還忘記了外殼可以擴展-iname \*.Rmd -o -iname \*.el
的引號。*/.git/*
您可能還想替換
-print0
和 usefzf --read0
以便它也適用於包含換行符的文件路徑。