Linux

如何將這三個查找命令合二為一?

  • August 20, 2021

我喜歡擁有我可能想要一個鍵綁定的每個文件。目前,我有一個帶有這三個查找命令的 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/*

您可能還想替換-printwith-print0和 usefzf --read0以便它也適用於包含換行符的文件路徑。

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