我喜欢通过一个键绑定来获取所有我可能需要的文件。目前我有一个 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
//目录,甚至不会同时查看它们。与仍然打印和目录以及其中找到的目录的第一个命令相比,这将会有所不同。.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/*
shell 可能扩展的引号。
您可能还想将 替换-print
为-print0
并使用fzf --read0
,以便它也适用于包含换行符的文件路径。