kou*_*_ch 4 command-line bash grep find
我想rstudio从以下位置开始递归搜索字符串(及其下面提到的不同可能的组合)/。
在某些位置,rstudio是另一个文件中的字符串(但该文件名未知);在其他位置,rstudio其本身是文件名(的一部分)(例如,rstudio 2023-10-20或2022-10-20-rstudio-file),并且该文件名(的一部分)未知。另外,让事情变得更复杂的是,有时是RStudio,有时是R Studio xe2\x80\x93 不同的情况和/或带有空格。
总而言之,可能的组合是
\nrstudio是文件内的字符串rstudio是一个文件名rstudio是一个目录名在上面三行的每一行中,请考虑字符串可以是rstudioor R Studioor Rstudioor r Studioor2022-10-20 RStudio file。(我希望你能了解各种可能的情况。)
对于输出,
\nrstudio(或其任何上述组合)是文件的名称,那么我需要该文件的目录名称,和
\nrstudio(或其任何上述组合)是另一个文件中的字符串,那么我需要相应的文件名及其位置。有人可以帮帮我吗?find我使用and查找了一些答案grep,但我无法得到它。
这会很慢,但如果您需要查看系统上的所有文件,那总是很慢。我会分两次完成此操作。一个用于find查找文件名,另一个用于grep查看文件内容。
查找名称中包含字符串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)
查找包含这些字符串之一的文件。
grep -ilR -E 'R Studio|rstudio' /
Run Code Online (Sandbox Code Playgroud)
在这里,我们使用扩展-R正则表达式 () 运行递归 ( -E) grep,并告诉它查找两个字符串中的任何一个。告诉-lgrep 仅打印文件的名称,而不是其中的匹配行。如上所述,为避免警告,请2> /dev/null以 root 身份添加或运行。
我没有进行任何分析,但进行单个递归下降可能比单独的find递归下降更快grep。其他一些潜在的优化:
避免搜索/dev和临时目录等/proc。/sys
不要在已根据名称选择的文件内部进行搜索
-I避免使用 grep或来搜索二进制文件--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' -- {} +
Run Code Online (Sandbox Code Playgroud)
我使用了-printf '%h/\n'而不是简单的-printf '%h\n',因为尾随/可以更容易地区分匹配是按名称还是按内容。
请注意,即使进行了修剪,您也应该会遇到许多“权限被拒绝”错误,除非以上命令以 root 身份运行。
locate非常适合查找文件和目录。
locate -i rstudio
locate -i "R studio"
Run Code Online (Sandbox Code Playgroud)
易于记忆,并且它将是最快的方法,因为它使用自己的缓存来显示结果。它还始终显示完整路径。如果您使用,-c您只会获得找到的文件数。-0将使用 NULL 作为分隔符,因此使其成为单行代码。
它可能没有安装:sudo apt install plocate并更新其数据库:sudo updatedb。
Terdon 的答案是在文件内搜索。