0014. shell命令--file

目录

14. shell命令--file

功能说明

语法格式

选项说明

实践操作

注意事项


14. shell命令--file

功能说明

        file 是 Linux 中的一个命令行工具,用于确定给定文件的类型。它可以检测文件是 ASCII 文本、可执行文件、压缩文件、图片、音频文件等。这对于快速识别文件内容或格式非常有用。

        由于 Linux 系统并不是像 Windows 系统那样通过扩展名来定义文件类型的,因此用户无法直接通过文件名来进行区别。file 命令可以通过分析文件头部信息中的标识信息来显示文件类型,使用很方‍便。

语法格式

file [-bcLvz][-f <名称文件>][-m <魔法数字文件>...][文件或目录...]

SYNOPSIS
  file [-bchiklLNnprsvz0] [--apple] [--mime-encoding] [--mime-type] [-e testname]
       [-F separator] [-f namefile] [-m magicfiles] file ...
  file -C [-m magicfiles]
  file [--help]

选项说明

  • -b: 只在输出中显示文件类型,不显示文件名。
  • --brief: 与 -b 相同。
  • -c:详细显示指令执行过程,便于排错或分析程序执行的情形。
  • -i: 显示文件的 MIME 类型。
  • -L:直接显示符号连接所指向的文件的类别。
  • -s: 尽可能多地读取文件以进行类型检测。
  • -z 或 --uncompress: 尝试查看压缩文件的内容。
  • -m:指定魔法数字文件。
  • --mime-type: 显示文件的 MIME 类型,但不带参数。
  • -f:指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称。
  • [文件或目录...]:要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。

实践操作

1. 显示目录或文件类型
mkdir -p /test/file    #创建测试目录
cd /test/file   #切换到测试目录
mkdir dir1    #创建测试目录
file dir1    #直接使用
file -b dir1/    #不显示目录名称
file -i dir1/    #显示 MIME 类别
file -bi dir1/
touch file1.txt    #创建测试文件
file file1.txt    # empty 是空的意思,里面没有内容
file -bi file1.txt
echo linux >file1.txt    #向文件 file1.txt 写入内容
cat file1.txt    #文件里面有内容了
file file1.txt    #再次查看文件类型,变成文本文件了,ASCII text ASCII文本

2. 显示更多的文件类型
ls -lh /bin
file /bin
file -L /bin    #直接显示符号连接所指向的文件的类别
file /dev/cdrom
file -L /dev/cdrom
ln -s file1.txt file1_soft_like.txt    #创建软连接文件,以后会讲到
ll
file file1_soft_like.txt    # symbolic link 符号链接
file -L file1_soft_like.txt
pwd
cd ..
tar zcf file.tar.gz file/    #打包文件,模拟环境
tar tf file.tar.gz    #查看包里内容
mv file.tar.gz file
ls
cd -
ls
file file.tar.gz    # gzip compressed data :gzip压缩数据类型
file -z file.tar.gz    #了解即可

命令示例:1. 显示目录或文件类型

mkdir -p /test/file    
cd /test/file   
mkdir dir1    
file dir1    
file -b dir1/    
file -i dir1/    
file -bi dir1/
touch file1.txt    
file file1.txt    
file -bi file1.txt
echo linux >file1.txt    
cat file1.txt    
file file1.txt

输出结果:

[root@MineGi ~]# mkdir -p /test/file    
[root@MineGi ~]# cd /test/file 
[root@MineGi /test/file]# mkdir dir1    
[root@MineGi /test/file]# file dir1    
dir1: directory
[root@MineGi /test/file]# file -b dir1/
directory
[root@MineGi /test/file]# file -i dir1/    
dir1/: inode/directory; charset=binary
[root@MineGi /test/file]# file -bi dir1/
inode/directory; charset=binary
[root@MineGi /test/file]# touch file1.txt   
[root@MineGi /test/file]# file -bi file1.txt
inode/x-empty; charset=binary
[root@MineGi /test/file]# echo linux >file1.txt
[root@MineGi /test/file]# cat file1.txt    
linux
[root@MineGi /test/file]# file file1.txt
file1.txt: ASCII text
[root@MineGi /test/file]#

命令示例:2. 显示更多的文件类型

ls -lh /bin
file /bin
file -L /bin    
file /dev/cdrom
file -L /dev/cdrom
ln -s file1.txt file1_soft_like.txt    
ll
file file1_soft_like.txt    
file -L file1_soft_like.txt
pwd
cd ..
tar zcf file.tar.gz file/    
tar tf file.tar.gz    
mv file.tar.gz file
ls
cd -
ls
file file.tar.gz    
file -z file.tar.gz 

输出结果:

[root@MineGi /test/file]# ls -lh /bin
lrwxrwxrwx. 1 root root 7 11月 22 09:52 /bin -> usr/bin
[root@MineGi /test/file]# file /bin
/bin: symbolic link to `usr/bin'
[root@MineGi /test/file]# file -L /bin 
/bin: directory
[root@MineGi /test/file]# file /dev/cdrom
/dev/cdrom: symbolic link to `sr0'
[root@MineGi /test/file]# file -L /dev/cdrom
/dev/cdrom: block special
[root@MineGi /test/file]# ln -s file1.txt file1_soft_like.txt 
[root@MineGi /test/file]# ll
总用量 4
drwxr-xr-x 2 root root 6 11月 27 15:59 dir1
lrwxrwxrwx 1 root root 9 11月 27 16:00 file1_soft_like.txt -> file1.txt
-rw-r--r-- 1 root root 6 11月 27 16:00 file1.txt
[root@MineGi /test/file]# file file1_soft_like.txt    
file1_soft_like.txt: symbolic link to `file1.txt'
[root@MineGi /test/file]# file -L file1_soft_like.txt
file1_soft_like.txt: ASCII text
[root@MineGi /test/file]# pwd
/test/file
[root@MineGi /test/file]# cd ..
[root@MineGi /test]# tar zcf file.tar.gz file/    
[root@MineGi /test]# tar tf file.tar.gz   
file/
file/dir1/
file/file1.txt
file/file1_soft_like.txt
[root@MineGi /test]# mv file.tar.gz file
[root@MineGi /test]# ls
chattr  cp  file  mkdir  mv  rm  touch  tree
[root@MineGi /test]# cd -
/test/file
[root@MineGi /test/file]# ls
dir1  file1_soft_like.txt  file1.txt  file.tar.gz
[root@MineGi /test/file]# file file.tar.gz    
file.tar.gz: gzip compressed data, from Unix, last modified: Wed Nov 27 16:01:31 2024
[root@MineGi /test/file]# file -z file.tar.gz 
file.tar.gz: POSIX tar archive (GNU) (gzip compressed data, from Unix, last modified: Wed Nov 27 16:01:31 2024)
[root@MineGi /test/file]#

注意事项

  • file 命令主要基于文件的“魔术数字”来确定文件类型。这些通常是文件开头或特定位置的特定字节序列。
  • 对于某些类型的文件,如加密或混淆的文件,file 可能无法准确确定其类型。
  • 某些类型的文件可能具有相似的“魔术数字”,因此可能存在误报的情况。

        file 命令使用一个称为 "magic" 的文件来确定文件类型,这个文件通常位于 /usr/share/file/magic。你可以通过修改这个文件或创建自己的 magic 文件来扩展或自定义 file 命令的文件类型检测能力。

        file 命令是一个强大的工具,可以帮助你快速了解文件的基本信息和类型。无论是普通的文本文件、图片、音频文件,还是更复杂的可执行文件或压缩文件,file 命令都能为你提供有用的信息。通过掌握其基本用法和高级选项,你可以更有效地管理和处理 Linux 系统中的文件。同时,记得在必要时查阅手册页(man file)以获取更详细的信息和示例。

在使用 `adb shell am profile` 命令进行性能分析时,指定输出文件路径是一个关键步骤。若命令执行失败,通常与文件路径的权限设置或目录结构有关。 ### 使用 ADB 启动应用性能分析的正确方式 当使用 `adb shell am profile com.example.round start --file /data/local/tmp/myapp.trace` 命令尝试启动方法跟踪记录时,如果遇到错误,可能是由于目标路径 `/data/local/tmp/` 不支持写入 trace 文件所导致。Android 系统中某些目录对普通用户或调试工具不具备写权限,尤其是非 root 用户无法写入 `/data/local/tmp/` 或其他系统目录[^2]。 为了确保 trace 文件能够成功生成,建议将输出路径指定为设备上的可写目录,例如 `/sdcard/` 或 `/storage/emulated/0/`,这些路径通常允许通过 ADB 写入文件: ```bash adb shell am profile com.example.round start --file /sdcard/myapp.trace ``` 此命令会为包名为 `com.example.round` 的应用启动方法跟踪功能,并将结果保存到 SD 卡根目录下的 `myapp.trace` 文件中。完成性能数据采集后,应调用以下命令停止 trace 并关闭分析会话: ```bash adb shell am profile com.example.round stop ``` trace 文件生成后,可以通过 `adb pull` 命令将其复制到本地开发环境进行分析: ```bash adb pull /sdcard/myapp.trace . ``` 随后,使用 Android Studio 的 CPU Profiler 工具打开该 `.trace` 文件,即可查看详细的函数调用时间线、执行耗时以及线程状态等信息[^1]。 ### Trace 文件生成失败的常见原因 1. **路径权限问题**:如 `/data/local/tmp/` 目录通常需要 root 权限才能写入。对于未 root 的设备,应避免使用此类路径。 2. **路径不存在或不可写**:部分设备可能未挂载 `/data/local/tmp/`,或者该目录下没有足够的空间存储 trace 数据。 3. **应用未处于运行状态**:只有当目标应用正在运行时,`am profile` 命令才能生效。否则会提示“Application is not running”之类的错误。 4. **命名冲突或文件锁定**:若同名 trace 文件已存在且被占用,可能导致新文件无法创建。 ### 性能分析的最佳实践 - 在代码中使用 `Trace.beginSection()` 和 `Trace.endSection()` 可以更精细地控制 trace 的范围,仅记录特定方法的执行过程,减少冗余数据的采集量。 - 如果希望 trace 文件存储在特定位置(如内部存储),可以结合 `Context.getFilesDir()` 或 `Context.getExternalFilesDir()` 获取可写路径,并通过 Java 代码启动 trace 会话。 - 对于自动化测试场景,可通过脚本控制 trace 的启动和停止,实现批量性能数据采集。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MineGi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值