递归搜索“字符串”或“带空格的字符串”,可能是文件或目录名称或文件内的文本

递归搜索“字符串”或“带空格的字符串”,可能是文件或目录名称或文件内的文本

我想rstudio从 开始递归搜索字符串(以及下面提到的不同可能的组合)/

在某些位置,rstudio是另一个文件内的字符串(但不知道此文件名);而在其他位置,rstudio本身是文件名(的一部分)(例如rstudio 2023-10-202022-10-20-rstudio-file),并且不知道此文件名(的一部分)。此外,为了使事情变得更加复杂,有时是RStudio,有时是R Studio– 不同情况和/或带有空格。

总而言之,可能的组合是

  • rstudio是文件内的字符串
  • rstudio是文件名
  • rstudio是目录名

在上述三行中,请考虑字符串可以是rstudioR StudioRstudio或。 (我希望您了解各种可能的情况。r Studio2022-10-20 RStudio file

对于输出,

  • 如果rstudio(或上述任何组合)是文件的名称,那么我需要该文件的目录名称,

  • 如果rstudio(或其上述任何组合)是另一个文件中的字符串,那么我需要相应的文件名及其位置。

find有人能帮帮我吗?我使用和查找了一些答案,grep但还是没能找到。

答案1

我没有做过任何分析,但是可能执行单个递归下降比执行单独的find递归下降要快grep。其他一些潜在的优化:

  1. 避免搜索/dev和短暂的目录等/proc/sys

  2. 不要搜索里面已根据名称选择的文件

  3. 避免使用 grep-I--binary-files=without-match

  4. 使用 grep 的固定字符串模式,因为或rstudioR 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查看文件内容。

  1. 查找名称包含字符串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
    
  2. 查找包含这些字符串之一的文件。

    grep -ilR -E 'R Studio|rstudio' /
    

    -R在这里,我们运行带有扩展正则表达式( ) 的递归 ( ) grep -E,并告诉它查找两个字符串中的任一个。告诉-lgrep 只打印文件的名称,而不是其中匹配的行。如上所述,为避免出现警告,请添加2> /dev/null或以 root 身份运行。

答案3

locate非常适合查找文件和目录。

locate -i rstudio
locate -i "R studio"

容易记住,而且它是最快的方法,因为它使用自己的缓存来显示结果。它还始终显示完整路径。如果您使用,则-c只会获得找到的文件数。-0将使用 NULL 作为分隔符,因此使其成为一行。

它可能尚未安装:sudo apt install plocate并更新其数据库:sudo updatedb

在文件内部进行搜索是在 Terdon 的回答中。

相关内容