UNIX 命令 - 查找

Nic*_*rin 11 command-line find

我正在尝试学习 UNIX 命令,我正在玩这个游戏来学习,我现在真的被困住了。我通过 ssh 在服务器中,目录中充满了随机文件和文件夹,下一级的密码在其中一个文件中。我被告知该文件具有以下属性:

  • 人类可读的
  • 1033 字节
  • 不可执行

我猜我应该使用该find命令,我尝试过,find ! -executable但返回了大量文件。我可以在手册或在线中找到的唯一人类可读的帮助是以人类可读的方式打印文件大小。所以我在那里有点迷失?

我也确实尝试过,find ~ -size 1033b但没有任何回报。但是当我尝试时,find ~ -size -1033b它返回了目录中的每个文件。

roz*_*acz 19

要过滤掉人类可读的文件名,您可以使用[:print:]可打印字符类名称。您将在grep.

find . -type f -size 1033c -name "[[:print:]]*" ! -executable
Run Code Online (Sandbox Code Playgroud)

再想一想,“人类可读”的要求可能是指文件的内容,而不是其名称。换句话说,您将搜索文本文件。这有点棘手。正如@D_Bye 在评论中所建议的那样,您应该使用该file命令来确定文件内容类型。但是file在管道之后运行不是一个好主意,因为它会使显示文件名的任务复杂化。这是我的建议:

find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print
Run Code Online (Sandbox Code Playgroud)

这是file-part 的简要工作方式:

  • 所述-exec谓词执行sh -c 'file -b $0 | grep -q text' FILENAME为每个FILENAME满足所有上述条件(类型,大小,不可执行)。
  • 对于这些文件中的每一个,shell ( sh) 运行这个简短的脚本: file -b $0 | grep -q text,替换$0为文件名。
  • file程序确定每个文件的内容类型并输出此信息。该-b选项可防止打印每个测试文件的名称。
  • grep过滤来自file程序的输出,搜索包含"text" 的行。(亲自查看file命令的典型输出是什么样的。)
  • grep不输出过滤后的文本,因为它-q给出了(quiet) 选项。它所做的只是将其退出状态更改为0(表示“真”——找到过滤的文本)或 1(表示“错误”——文本“文本”没有出现在 的输出中file)。
  • 来自 from 的真/假退出状态grepshto进一步传递find并作为整个“ -exec sh -c 'file $0 | grep -q text' {} \;”测试的最终结果。
  • 如果上述测试返回true-print则执行命令(即打印测试文件的名称)。


小智 8

find . -type f -readable -size 1033c ! -executable
Run Code Online (Sandbox Code Playgroud)

请注意,我使用了c代替b文件大小。 b用于 512 字节块。 c用于实际字节。

  • 我不认为`-readable` 意味着人类可读(即不是二进制) (2认同)