查找人类可读的文件

查找人类可读的文件

我正在尝试找到一种有效的方法来做到这一点OverTheWire 强盗挑战第 5 级

无论如何,我有一堆文件,但只有一个满足以下条件:

  • 人类可读
  • 大小为 1033 字节
  • 不可执行

现在,我正在使用find命令。我能够找到符合最后两个条件的文件:

find . -size 1033c ! -executable

但是,我不知道如何排除非人类可读的文件。我为该挑战找到的解决方案使用-readable测试参数,但我认为这行不通。-readable只查看文件的权限,而不查看其内容,而挑战描述则要求提供 ASCII 文件或类似文件。

答案1

是的,您可以用来find查找大小正确的非可执行文件,然后用来file检查 ASCII。就像是:

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

然而,问题并不像听起来那么简单。 “人类可读”是一个非常模糊的术语。想必您指的是文本。好的,但是什么样的文本呢?仅限拉丁字符 ASCII?完整的统一码?例如,考虑这三个文件:

$ cat file1
abcde
$ cat file2
αβγδε
$ cat file3
abcde
αβγδε
$ cat file4
#!/bin/sh
echo foo

这些都是文本和人类可读的。现在,让我们看看file它们是什么:

$ file *
file1: ASCII text
file2: UTF-8 Unicode text
file3: UTF-8 Unicode text
file4: POSIX shell script, ASCII text executable

因此,find上面的命令只会查找file1(为了这个示例,我们假设这些文件有 1033 个字符)。您可以展开 来find查找字符串text

find . -type f -size 1033c ! -executable -exec file {} + | grep -w text

使用-w,将仅打印作为独立单词找到的grep行。text应该非常接近您想要的内容,但我不能保证没有其他文件类型的描述也可能包含 string text

答案2

虽然-exec主要用于对找到的文件执行某些操作,但它也可以充当测试。因此,我们可以将其添加到您的其他标准中:

find . \
  -size 1033c \
  -not -executable \
  -exec sh -c 'file {} | grep "text$"' \;

请记住,grep当未找到模式时,返回非零值,并将sh -c "COMMAND"返回评估结果(只要它有效)。因此,这将仅打印file <filename>输出以 结尾的文件text,例如“UTF-8 Unicode 文本”或“ASCII 文本”,而不是“非 ISO 扩展 ASCII 文本,带有转义序列”。

在一行中,它甚至比 over 还要短xargs

find . -size 1033c -not -executable -exec sh -c 'file {} | grep "text$"' \;

请记住,您可以替换sh -c 'file {} | grep "text$"'为任何自定义命令。如果您想检查非常复杂的内容,最好提供一个 shell 脚本并使用它:

find . -size 1033c -not -executable -exec is_human_readable.sh {} \;

从长远来看,它比 shell 的历史记录更容易维护:

#!/bin/sh
file "$@" | grep "text$" > /dev/null

答案3

只有 1 个字节1033大小的文件。

bandit5@bandit:~$ find -size 1033c
./inhere/maybehere07/.file2
bandit5@bandit:~$ 

为什么1033c又不呢1033?检查man页面

   -size n[cwbkMG]
          File uses n units of space, rounding up.  The following suffixes can be used:

          `b'    for 512-byte blocks (this is the default if no suffix is used)

          `c'    for bytes

          `w'    for two-byte words

          `k'    for Kilobytes (units of 1024 bytes)

          `M'    for Megabytes (units of 1048576 bytes)

          `G'    for Gigabytes (units of 1073741824 bytes)

ls -l用and命令验证一下file,你就得到了所有的答案。

bandit5@bandit:~$ ls -l ./inhere/maybehere07/.file2
-rw-r----- 1 root bandit5 1033 May  7 20:15 ./inhere/maybehere07/.file2
bandit5@bandit:~$ 
bandit5@bandit:~$ file ./inhere/maybehere07/.file2
./inhere/maybehere07/.file2: ASCII text, with very long lines
bandit5@bandit:~$ 
  1. 人类可读 ( ASCII text)
  2. 大小为 1033 字节(也在ls -l输出中)
  3. 不可执行 ( -rw-r-----)

答案4

find . -size 1033c ! -executable -exec file {} +

相关内容