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

kou*_*_ch 4 command-line bash grep find

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

\n

在某些位置,rstudio是另一个文件中的字符串(但该文件名未知);在其他位置,rstudio其本身是文件名(的一部分)(例如,rstudio 2023-10-202022-10-20-rstudio-file),并且该文件名(的一部分)未知。另外,让事情变得更复杂的是,有时是RStudio,有时是R Studio xe2\x80\x93 不同的情况和/或带有空格。

\n

总而言之,可能的组合是

\n
    \n
  • rstudio是文件内的字符串
  • \n
  • rstudio是一个文件名
  • \n
  • rstudio是一个目录名
  • \n
\n

在上面三行的每一行中,请考虑字符串可以是rstudioor R Studioor Rstudioor r Studioor2022-10-20 RStudio file。(我希望你能了解各种可能的情况。)

\n

对于输出,

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

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

有人可以帮帮我吗?find我使用and查找了一些答案grep,但我无法得到它。

\n

ter*_*don 6

这会很慢,但如果您需要查看系统上的所有文件,那总是很慢。我会分两次完成此操作。一个用于find查找文件名,另一个用于grep查看文件内容。

  1. 查找名称中包含字符串rstudio或 的文件R Studio(不区分大小写),并打印包含它们的目录的名称。

    find / \( -iname "*rstudio*" -or -iname "*R Studio*") -printf '%h\n' 
    
    Run Code Online (Sandbox Code Playgroud)

    这将搜索名称/包含两个所需字符串之一的目录中的所有文件(和目录以及其他任何内容),然后打印目录名称(%h请参阅man find)。您可以通过它sort -u来删除重复项。为了避免权限被拒绝警告,请添加2> /dev/null到末尾,或以 root 身份运行:

    sudo find \( -iname "*rstudio*" -or -iname "*R Studio*" \) -printf '%h\n' | sort -u
    
    Run Code Online (Sandbox Code Playgroud)

    或者,如果您不关心用户无法读取的目录

    find  \( -iname "*rstudio*" -or -iname "*R Studio*" \) -printf '%h\n' 2> /dev/null | sort -u
    
    Run Code Online (Sandbox Code Playgroud)
  2. 查找包含这些字符串之一的文件。

    grep -ilR -E 'R Studio|rstudio' /
    
    Run Code Online (Sandbox Code Playgroud)

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


ste*_*ver 6

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

  1. 避免搜索/dev和临时目录等/proc/sys

  2. 不要在已根据名称选择的文件内部进行搜索

  3. -I避免使用 grep或来搜索二进制文件--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' -- {} +
Run Code Online (Sandbox Code Playgroud)

我使用了-printf '%h/\n'而不是简单的-printf '%h\n',因为尾随/可以更容易地区分匹配是按名称还是按内容。

请注意,即使进行了修剪,您也应该会遇到许多“权限被拒绝”错误,除非以上命令以 root 身份运行。


Rin*_*ind 5

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

locate -i rstudio
locate -i "R studio"
Run Code Online (Sandbox Code Playgroud)

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

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

Terdon 的答案是在文件内搜索。