我想rstudio
从 开始递归搜索字符串(以及下面提到的不同可能的组合)/
。
在某些位置,rstudio
是另一个文件内的字符串(但不知道此文件名);而在其他位置,rstudio
本身是文件名(的一部分)(例如rstudio 2023-10-20
或2022-10-20-rstudio-file
),并且不知道此文件名(的一部分)。此外,为了使事情变得更加复杂,有时是RStudio
,有时是R Studio
– 不同情况和/或带有空格。
总而言之,可能的组合是
rstudio
是文件内的字符串rstudio
是文件名rstudio
是目录名
在上述三行中,请考虑字符串可以是rstudio
或R Studio
或Rstudio
或。 (我希望您了解各种可能的情况。r Studio
)2022-10-20 RStudio file
对于输出,
- 如果
rstudio
(或上述任何组合)是文件的名称,那么我需要该文件的目录名称,
和
- 如果
rstudio
(或其上述任何组合)是另一个文件中的字符串,那么我需要相应的文件名及其位置。
find
有人能帮帮我吗?我使用和查找了一些答案,grep
但还是没能找到。
答案1
我没有做过任何分析,但是可能执行单个递归下降比执行单独的find
递归下降要快grep
。其他一些潜在的优化:
避免搜索
/dev
和短暂的目录等/proc
。/sys
不要搜索里面已根据名称选择的文件
避免使用 grep
-I
或--binary-files=without-match
使用 grep 的固定字符串模式,因为或
rstudio
都R studio
没有任何正则表达式元字符 - 请注意,GNU grep 在此模式下仍然尊重不区分大小写-i
和单词边界标志-w
,因此我们避免类似匹配Developer Studio
。
所以
find / \( -path /dev -o -path /proc -o -path /run -o -path /sys \) -prune \
-o \( -iname '*rstudio*' -o -iname '*r studio*' \) -printf '%h/\n' \
-o -type f -exec grep -IFiwl -e 'rstudio' -e 'r studio' -- {} +
我使用-printf '%h/\n'
而不是简单,-printf '%h\n'
因为尾随/
可以更容易区分匹配是通过名称还是通过内容。
请注意,即使经过修剪,除非以 root 身份运行上述操作,否则仍然会出现许多“权限被拒绝”错误。
答案2
这会很慢,但如果您需要查看系统上的所有文件,那么速度总是会很慢。我会分两次完成。一次,使用find
查找文件名,另一次,使用grep
查看文件内容。
查找名称包含字符串
rstudio
或的文件R Studio
(不区分大小写),并打印包含它们的目录的名称。find / \( -iname "*rstudio*" -or -iname "*R Studio*") -printf '%h\n'
这将搜索目录中
/
名称包含两个所需字符串之一的所有文件(和目录以及其他任何内容),然后打印目录名称(%h
,请参阅man find
)。您可以传递它sort -u
以删除重复项。要避免权限被拒绝警告,请将其添加2> /dev/null
到末尾,或以 root 身份运行:sudo find \( -iname "*rstudio*" -or -iname "*R Studio*" \) -printf '%h\n' | sort -u
或者,如果你不关心你的用户无法读取的目录
find \( -iname "*rstudio*" -or -iname "*R Studio*" \) -printf '%h\n' 2> /dev/null | sort -u
查找包含这些字符串之一的文件。
grep -ilR -E 'R Studio|rstudio' /
-R
在这里,我们运行带有扩展正则表达式( ) 的递归 ( ) grep-E
,并告诉它查找两个字符串中的任一个。告诉-l
grep 只打印文件的名称,而不是其中匹配的行。如上所述,为避免出现警告,请添加2> /dev/null
或以 root 身份运行。
答案3
locate
非常适合查找文件和目录。
locate -i rstudio
locate -i "R studio"
容易记住,而且它是最快的方法,因为它使用自己的缓存来显示结果。它还始终显示完整路径。如果您使用,则-c
只会获得找到的文件数。-0
将使用 NULL 作为分隔符,因此使其成为一行。
它可能尚未安装:sudo apt install plocate
并更新其数据库:sudo updatedb
。
在文件内部进行搜索是在 Terdon 的回答中。