如何将这三个查找命令合并为一个?

如何将这三个查找命令合并为一个?

我喜欢通过一个键绑定来获取所有我可能需要的文件。目前我有一个 shell 脚本,其中包含这三个 find 命令,我将其通过管道传输到 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

如果有人想批评我丑陋的查找命令并建议一种更有效/更干净的白名单/黑名单文件扩展名方式 - 我将不胜感激。

编辑 我简化了命令,以便更容易理解它们的功能。

  • 第一个命令查找主路径下的目录,~但排除.git目录及其子目录。
  • 第二个命令在主目录中查找文件,指定白名单文件扩展名,然后指定黑名单文件扩展名和路径。
  • 第三个在我的主目录中找到点文件,~但排除某些正则表达式。

答案1

或许:

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//目录,甚至不会同时查看它们。与仍然打印和目录以及其中找到的目录的第一个命令相比,这将会有所不同。.thunderbirdpython3.8findfind.thunderbirdpython3.8

为了能够报告深度 1 处的文件(与-maxdepth 1第三个命令一样),我们附加/.到搜索目录,并排除路径匹配的文件*/./*/*(低于 2 层以上/./)。但这意味着路径将被打印为/home/you/./file.txt.如果您不喜欢这样/./,您可以随时通过将输出通过管道传递到 来摆脱它| sed 's|/\./||;1s|/\.$//'

请注意,您的内容! -iname index.txt是多余的,因为无论如何index.txt都不会匹配-iname \*.Rmd -o -iname \*.el。您还忘记了*/.git/*shell 可能扩展的引号。

您可能还想将 替换-print-print0并使用fzf --read0,以便它也适用于包含换行符的文件路径。

相关内容