我正在阅读有关file命令的内容,但遇到了一些我不太明白的事情:
file 旨在确定被查询的文件类型.... file 通过对相关文件执行三组测试来实现这一点:
- 文件系统测试,
- 魔法测试,
- 语言测试
什么是魔法测试?
我需要识别随机文件中包含的数据类型。我是 Linux 新手。
我打算使用该file命令来了解文件具有的数据类型。我尝试了该命令并得到了下面的输出。
有人向我建议该file命令查看文件的初始字节以确定数据类型。该file命令根本不查看文件扩展名。那是对的吗?我查看了手册页,但觉得它太技术性了。如果有人可以提供一个链接,该链接对file命令的工作方式有更简单的解释,我将不胜感激。
运行file命令后我可以获得哪些不同的可能答案?例如,在下面的成绩单中,我得到了 JPEG、ISO 媒体、ASCII 等:
屏幕输出如下
m7% file date-file.csv
date-file.csv: ASCII text, with CRLF line terminators
m7% file image-file.JPG
image-file.JPG: JPEG image data, EXIF standard
m7% file music-file.m4a
music-file.m4a: ISO Media, MPEG v4 system, iTunes AAC-LC
m7% file numbers-file.txt
numbers-file.txt: ASCII text
m7% file pdf-file.pdf
pdf-file.pdf: PDF document, version 1.4
m7% file text-file.txt
text-file.txt: ASCII text
m7% file video-file.MOV
video-file.MOV: data
Run Code Online (Sandbox Code Playgroud)
感谢您的回答,他们为我澄清了一些事情。 …
为什么file xxx.src导致cannot open `xxx.src' (No such file or directory)但退出状态为 0(成功)?
$ file xxx.src ; echo $?
xxx.src: cannot open `xxx.src' (No such file or directory)
0
Run Code Online (Sandbox Code Playgroud)
注意:比较ls:
$ ls xxx.src ; echo $?
ls: cannot access 'xxx.src': No such file or directory
2
Run Code Online (Sandbox Code Playgroud) 当我阅读时,file(1)我在手册页中注意到了这一点(强调我的):
将本地定义添加到 /etc/magic 时,请确保保留这些关键字。用户依赖于知道目录中的所有可读文件都印有“文本”一词。不要像伯克利那样将“shell 命令文本”更改为“shell 脚本”。
这句话背后有什么故事?我猜Berkeley是指,BSD (Berkeley software distribution)但谷歌没有提供足够的信息。
链接到file(1) http://man7.org/linux/man-pages/man1/file.1.html
一些挖掘表明该声明是在 27 年前添加的链接
Don't do as one computer vendor did \- change ``shell commands text''
to ``shell script''.
Run Code Online (Sandbox Code Playgroud)
后来改为当前声明链接
Don't do as Berkeley did \- change ``shell commands text''
Run Code Online (Sandbox Code Playgroud) 考虑 的共享对象依赖项/bin/bash,其中包括/lib64/ld-linux-x86-64.so.2(动态链接器/加载器):
ldd /bin/bash
linux-vdso.so.1 (0x00007fffd0887000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f57a04e3000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f57a04de000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f57a031d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f57a0652000)
Run Code Online (Sandbox Code Playgroud)
检查/lib64/ld-linux-x86-64.so.2表明它是一个符号链接/lib/x86_64-linux-gnu/ld-2.28.so:
ls -la /lib64/ld-linux-x86-64.so.2
lrwxrwxrwx 1 root root 32 May 1 19:24 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.28.so
Run Code Online (Sandbox Code Playgroud)
此外,file报告/lib/x86_64-linux-gnu/ld-2.28.so本身是动态链接的:
file -L /lib64/ld-linux-x86-64.so.2
/lib64/ld-linux-x86-64.so.2: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
Run Code Online (Sandbox Code Playgroud)
我想知道:
/lib64/ld-linux-x86-64.so.2) 本身如何动态链接?它在运行时链接自己吗?/lib/x86_64-linux-gnu/ld-2.28.so记录在案以处理 a.out 二进制文件 ( man ld.so),但是/bin/bash …我知道我可以使用find:找到文件find . -type f -name 'sunrise'。结果示例:
./sunrise
./events/sunrise
./astronomy/sunrise
./schedule/sunrise
Run Code Online (Sandbox Code Playgroud)
我也知道我可以确定文件的文件类型:file sunrise. 结果示例:
sunrise: PEM RSA private key
Run Code Online (Sandbox Code Playgroud)
但是如何按文件类型查找文件?
例如my-find . -type f -name 'sunrise' -filetype=bash-script:
./astronomy/sunrise
./schedule/sunrise
Run Code Online (Sandbox Code Playgroud) 我有许多文件(Jupyter 笔记本.ipynb),它们是文本文件。所有这些都包含一些 LaTeX 标记。但是当我运行时file,我得到:
$ file nb_*
nb_1.ipynb: ASCII text
nb_2.ipynb: ASCII text
nb_3.ipynb: ASCII text, with very long lines
nb_4.ipynb: LaTeX document, ASCII text, with very long lines
nb_5.ipynb: text, with very long lines
Run Code Online (Sandbox Code Playgroud)
file这些怎么区分?我希望所有文件都具有相同的类型。
(为什么文件应该有相同的类型?我将它们上传到在线系统进行共享。系统以某种方式对它们进行分类并以不同的方式对待它们,我不可能更改它。我怀疑该平台在内部使用file或可能使用libmagic和想解决这个问题。)
我正在寻找一种方法来确定包含数千个文件的文件夹中的文件类型。文件名没有透露太多,也没有扩展名,但类型不同。具体来说,我试图确定一个文件是否是一个 sqlite 数据库。
使用该file命令时,它确定每秒 2-3 个文件的类型。这似乎是解决问题的好方法,只是它太慢了。
然后我尝试用 sqlite3 打开每个文件并检查是否有错误。这样,我每秒可以检查 4-5 个文件。好多了,但我认为可能有更好的方法来做到这一点。
我有一个图像档案,我会跟上。有时,我将它们从重新格式化的网站中提取出来,同时保持扩展名不变,最常见的是将 PNG 图像转换为仍然命名为“.png”的 JPG。有没有办法发现这种情况何时发生并自动修复?
在 Windows 上,我为此使用了 IrfanView,但这需要一个 Wine 包装器。
为什么以下不返回text/csv?
$ echo 'foo,bar\nbaz,quux' > temp.csv;file -b --mime temp.csv
text/plain; charset=us-ascii
Run Code Online (Sandbox Code Playgroud)
我使用这个例子是为了更加清晰,但我也遇到了其他 CSV 文件的问题。
$ file -b --mime '/Users/jasonswett/projects/client_work/gd/spec/test_files/wtf.csv'
text/plain; charset=us-ascii
Run Code Online (Sandbox Code Playgroud)
为什么它不认为 CSV 是 CSV?我可以对 CSV 做些什么来file返回“正确”的东西吗?
file-command ×10
files ×3
file-format ×2
file-types ×2
linux ×2
mime-types ×2
command ×1
exit-status ×1
find ×1
history ×1
performance ×1
sqlite ×1
terminology ×1
text ×1
utilities ×1