我正在尝试找到一种有效的方法来做到这一点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:~$
- 人类可读 (
ASCII text
) - 大小为 1033 字节(也在
ls -l
输出中) - 不可执行 (
-rw-r-----
)
答案4
find . -size 1033c ! -executable -exec file {} +