「Efficient Android Threading 笔记」- C1 Android Components and the Need for Multiprocessing Android RecyclerView Android Socket Programming Supporting Multiple Screens Make a Reusable UI in Android App Development 如何在 Android Studio 中包含 *.so library,并使用库中定义的方法? 使用 SpannableString 格式化字符串,实现前景色、下划线、超链接、图文混排等 如何使用 bound service 完成进程间通信? 创建自定义视图 Creating custom views 通过 Android Theme & Style 定制应用的样式 「译」Android ViewPropertyAnimator 介绍 Android Animation Interpolator - Android 动画插值器源码笔记 「译」Android Animation in Honeycomb by Chet Haase(Android 3.0系统中的动画机制) 从 Android Sample ApiDemos 中学习 android.animation API 的用法 如何学习 Android Animation? 如何实现 Android ListView「上拉加载更多」? 「译」向Big Nerd Ranch提问:为什么Fragment在Android App开发中非常重要? 分类整理我在 SegmentFault 上针对某些问题作的回答 Android Servcie 后台服务总结笔记 如何在Android设备旋转时暂存数据以保护当前的交互状态? Android Message Handler 消息处理机制总结笔记 如何获取FragmentTabHost中指定标签页的Fragment? Fragment子类必须包含一个public无参构造器 如何更新及替换ViewPager中的Fragment? 如何使用Android UI Fragment开发“列表-详情”界面? 一个Android音频文本同步的英文有声读物App的开发过程 「Android编程权威指南笔记」Android应用本地化 通过jfeinstein10/SlidingMenu实现Android侧滑菜单 为Ubuntu14.04部署Android App的Eclipse开发环境 「Android编程权威指南笔记」使用ListFragment显示列表 「Android编程权威指南笔记」SDK版本与兼容 「Android编程权威指南笔记」Android布局和组件 「Android编程权威指南笔记」UI Fragment 「Android编程权威指南笔记」Activity 第一次开发iOS App和Android的对比总结笔记 「App Training笔记」创建第一个应用 「App Training笔记」开发入门训练大纲 Android APP - 从远程FTP服务器下载文件到本地

「Shell脚本学习指南笔记」第10章-文件处理

2014年04月15日

本章讨论处理文件时常见的一些命令,如,列出文件、修改时间戳、建立临时文件、在目录层级中寻找文件、将命令应用到文件列表、计算文件系统空间的使用量、比较文件。

列出文件


ls -liRs *          显示文件(冗长的、inode编号、递归的、以块为单位列出文件的大小)

寻找文件


快速寻找文件
locate将系统里的所有文件名压缩成数据库,以迅速找到匹配shell通配字符模式的文件名,不必实际查找整个庞大的目录结构。这个数据库通常在半夜通过cron,在具有权限的工作中执行updatedb建立。locate可以回答用户:系统管理者将gcc包放在何处?P292

寻找命令存储位置

# 当你调用一个没有路径的命令时,可以通过Bourne-Shell家族里的type命令查找它在文件系统里的位置。
# type是内建shell命令
$ type awk
awk is hashed (/usr/bin/awk)

find命令

find [ files-or-directories ] [ options ] 寻找与指定名称模式匹配的,或具有给定属性的文件。
find与其它UNIX命令最大的不同之处在于:要查找的文件或目录放在参数列表第一位,选项或操作在命令行最后。

find | LC_ALL=C sort        以传统顺序,排序find的输出结果。
find -ls                    寻找文件,并用 ls 风格(各种文件信息的列表)的输出结果
find -ls | sort -k11        寻找文件,并以文件名排序
find $HOME/. ! -user $USER  在登录目录下,列出所有不属于我的文件。!表示非,选项-user指定某用户的文件。
find $HOME/. -size +1024k   在登录目录下,寻找大于1024k的文件。+表示大于,-表示小于,无符号表示等于。
find . -size 0              在当前目录下,寻找空文件。无单位是默认情况,表示512Bytes。
find . -type d              在当前目录下,寻找目录。选项-type表示文件类型,d目录,f文件,l符号连接。
find . -mtime -7            在当前目录下,寻找7天内修改过的文件。-atime访问时间,-ctime是inode变更时间。符号表示在7天内,+号表示超过7天,无符号表示整好7天。
find . -mtime +7 -o -size 0 支持布尔运算,选项-o(是字母o)表示“或OR”,选项-a表示“与AND”。
find path -name 'pattern'   选定与文件名与pattern(shell通配字符模式)匹配的文件。

执行命令:xargs


把find产生的文件列表提供给另一个命令,有时很有用。
通常由shell的命令替换功能$()完成,下例是在系统的头文件中查找POSIX_OPEN_MAX符号。
当使用命令处理find产生的对象列表时,如果列表为空,也应该确保命令的行为是适当的。因为未给定grep文件参数时,会等待标准输入。所以提供/dev/null以确保find未产生输出时,grep不会卡在等待输入。P307

$ grep POSIX_OPEN_MAX /dev/null $(find /usr/include -type f | sort)
/usr/include/i386-linux-gnu/bits/posix1_lim.h:# define _POSIX_OPEN_MAX  20

来自命令替换产生的输出有时很长,如果超出环境变量规定的最大值getconf ARG_MAX,会提示”grep: Argument list too long.”
xargs可以解决这个问题:它在标准输入上取得参数列表、一行一个,将它们以适当大小组起来传给另一个命令。

$ find /usr/include -type f | sort | xargs grep POSIX_OPEN_MAX /dev/null

文件系统的空间信息


find -ls可以报告文件大小,加上awk程序,可以得到文件占据的字节数:

$ find -ls | awk '{ sum+=$7 } END { printf("Total: %.0f bytes\n", sum) }'
Total: 12291 bytes

然而文件以固定大小的块(block)配置,所以上述低估了空间的使用。它也不能提供整个文件系统已用空间、未用空间。df和du可以解决这些问题。

df命令

# disk free 磁盘可用空间,提供单行摘要,每行显示一个加载的文件系统磁盘使用信息。
$ df
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sda6      884533604 445397336 394204480  54% /home

# 选项-h表示human-readable
# 可以提供一个或多个文件系统名称或者加载点,来限制输出项目。
$ df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda6       844G  425G  376G  54% /home

du命令

# du命令可以提供指定目录树的空间使用情况,disk usage
# 选项-h表示human-readable,-s表示摘要summary
$ du -hs
12K     .

比较文件


  • 检查两个文件是否不同,若不同,找出不同之处:cmp和diff
  • 应用两个文件的不同之处,基于原始文件,为另一个文件打补丁:patch
  • 使用校验和(checksum)找出相同一致的文件:消息摘要工具md5、md5sum,安全散列算法工具sha、sha1sum等
  • 使用数字签名以验证文件。

版本

li2 于上海闸北
2014-04-15 ~ 2014-05-15, v1


知识共享许可协议
li2的博客WeiYi.Li 创作,采用 知识共享 署名-非商业性使用 4.0 国际 许可协议进行许可。
© 2011-2022. All rights reserved by WeiYi.Li. Powerd by Jekyll & LinAnYa's Theme