我正在读Unix 编程环境书。我遇到了这个od
命令。当我运行它时,该命令适用于文件内容,但不适用于目录。但是,根据本书作者的演示,该命令似乎适用于目录。
当我运行以下命令时:
od -c .
我收到一条错误消息:
od: .: read error: Is a directory
0000000
为什么我会收到这个错误?
答案1
为什么od -c directory
不起作用
目录指向零个、一个或一组文件,它本身并不是真正的文件,因此无法通过od
或进行处理hd
。大多数类 Unix 程序处理文件,而不是整个目录。
该怎么办
您可以使用 列出目录内容ls
,然后使用od -c
或hd -b
命令转储要检查的每个文件。通过逐个执行这些操作,您将知道每个文件包含的内容。
(od -c file1 file2
将文件 1 和文件 2 塞在一起,然后转储整个内容。这使得它能够找到第一个文件结束的位置和下一个文件开始的位置。)
您还可以编写一个小脚本,逐个提供目录中每个文件的文件名,然后将其转储为八进制或十六进制。以下是示例:
for f in *; do echo $f; od -c $f; done | less
for f in *
依次将当前目录下的每个文件分配给 $f;在echo $f
每次文件转储之前在终端上提供文件的名称;od -c $f
生成转储;并done
表示继续下一个文件,如果没有更多文件则完成。|less
表示采取以上所有内容并通过“less”程序发送输出,让您一点一点地查看它,而不是让所有内容从屏幕顶部滚落。
此类脚本由名为“shell”的程序解释。当您在终端中输入命令时,您正在与“shell”对话。默认情况下,Ubuntu 使用“bash”shell。
如果您希望查看十六进制输出,则可以使用od -t x1 filename
或hd filename
。使用man od
或man hd
获取更多选项。
答案2
如果要对当前目录及以下的所有文件进行八进制转储,请使用
find
,例如:od -c `查找-类型 f`
请参阅man find
或谷歌查看教程寻找了解更多信息。
答案3
为了能够将目录读取为文件,如书中所示Unix 编程环境(第 51 页)在较新版本的 Linux 中是不可能的。
正如这个答案中提到的(目录什么时候不再能作为文件被读取?) 在 Unix 和 Linux 子站点上,这似乎违反了 POSIX 标准,该标准允许将目录作为文件读取,只要它们以只读模式打开即可。
答案4
od [options] [files] od --traditional [file] [[+] offset [[+] label] ]
将指定的文件转储到标准输出。默认以八进制格式转储,但可以指定其他格式。如果有多个文件,则按指定顺序连接它们。如果未指定文件或文件为 -,则从标准输入读取。对于第二种形式,使用 --traditional 选项,只能指定一个文件。1
1来源:Linux 命令目录