在当前目录下通过文件名查找一个文件,使用类似于这样的命令:
find . -iname '*something*'
。在所有路径下通过文件名查找文件,使用locate something
(但注意到updatedb
可能没有对最近新建的文件建立索引,所以你可能无法定位到这些未被索引的文件)。使用
ag
在源代码或数据文件里检索(grep -r
同样可以做到,但相比之下ag
更加先进)。将 HTML 转为文本:
lynx -dump -stdin
。Markdown,HTML,以及所有文档格式之间的转换,试试
pandoc
。当你要处理棘手的 XML 时候,
xmlstarlet
算是上古时代流传下来的神器。使用
jq
处理 JSON。使用
shyaml
处理 YAML。要处理 Excel 或 CSV 文件的话,csvkit 提供了
in2csv
,csvcut
,csvjoin
,csvgrep
等方便易用的工具。当你要处理 Amazon S3 相关的工作的时候,
s3cmd
是一个很方便的工具而s4cmd
的效率更高。Amazon 官方提供的aws
以及saws
是其他 AWS 相关工作的基础,值得学习。了解如何使用
sort
和uniq
,包括 uniq 的-u
参数和-d
参数,具体内容在后文单行脚本节中。另外可以了解一下comm
。了解如何使用
cut
,paste
和join
来更改文件。很多人都会使用cut
,但遗忘了join
。了解如何运用
wc
去计算新行数(-l
),字符数(-m
),单词数(-w
)以及字节数(-c
)。了解如何使用
tee
将标准输入复制到文件甚至标准输出,例如ls -al | tee file.txt
。要进行一些复杂的计算,比如分组、逆序和一些其他的统计分析,可以考虑使用
datamash
。注意到语言设置(中文或英文等)对许多命令行工具有一些微妙的影响,比如排序的顺序和性能。大多数 Linux 的安装过程会将
LANG
或其他有关的变量设置为符合本地的设置。要意识到当你改变语言设置时,排序的结果可能会改变。明白国际化可能会使 sort 或其他命令运行效率下降许多倍。某些情况下(例如集合运算)你可以放心的使用export LC_ALL=C
来忽略掉国际化并按照字节来判断顺序。你可以单独指定某一条命令的环境,只需在调用时把环境变量设定放在命令的前面,例如
TZ=Pacific/Fiji date
可以获取斐济的时间。了解如何使用
awk
和sed
来进行简单的数据处理。 参阅 One-liners 获取示例。替换一个或多个文件中出现的字符串:
perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
使用
repren
来批量重命名文件,或是在多个文件中搜索替换内容。(有些时候rename
命令也可以批量重命名,但要注意,它在不同 Linux 发行版中的功能并不完全一样。)# 将文件、目录和内容全部重命名 foo -> bar:
repren --full --preserve-case --from foo --to bar .
# 还原所有备份文件 whatever.bak -> whatever:
repren --renames --from '(.*)\.bak' --to '\1' *.bak
# 用 rename 实现上述功能(若可用):
rename 's/\.bak$//' *.bak
根据 man 页面的描述,
rsync
是一个快速且非常灵活的文件复制工具。它闻名于设备之间的文件同步,但其实它在本地情况下也同样有用。在安全设置允许下,用rsync
代替scp
可以实现文件续传,而不用重新从头开始。它同时也是删除大量文件的最快方法之一:mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
若要在复制文件时获取当前进度,可使用
pv
,pycp
,progress
,rsync --progress
。若所执行的复制为block块拷贝,可以使用dd status=progress
。使用
shuf
可以以行为单位来打乱文件的内容或从一个文件中随机选取多行。了解
sort
的参数。显示数字时,使用-n
或者-h
来显示更易读的数(例如du -h
的输出)。明白排序时关键字的工作原理(-t
和-k
)。例如,注意到你需要-k1,1
来仅按第一个域来排序,而-k1
意味着按整行排序。稳定排序(sort -s
)在某些情况下很有用。例如,以第二个域为主关键字,第一个域为次关键字进行排序,你可以使用sort -k1,1 | sort -s -k2,2
。如果你想在 Bash 命令行中写 tab 制表符,按下 ctrl-v [Tab] 或键入
$'\t'
(后者可能更好,因为你可以复制粘贴它)。标准的源代码对比及合并工具是
diff
和patch
。使用diffstat
查看变更总览数据。注意到diff -r
对整个文件夹有效。使用diff -r tree1 tree2 | diffstat
查看变更的统计数据。vimdiff
用于比对并编辑文件。对于二进制文件,使用
hd
,hexdump
或者xxd
使其以十六进制显示,使用bvi
,hexedit
或者biew
来进行二进制编辑。同样对于二进制文件,
strings
(包括grep
等工具)可以帮助在二进制文件中查找特定比特。制作二进制差分文件(Delta 压缩),使用
xdelta3
。使用
iconv
更改文本编码。需要更高级的功能,可以使用uconv
,它支持一些高级的 Unicode 功能。例如,这条命令移除了所有重音符号:uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
拆分文件可以使用
split
(按大小拆分)和csplit
(按模式拆分)。操作日期和时间表达式,可以用
dateutils
中的dateadd
、datediff
、strptime
等工具。使用
zless
、zmore
、zcat
和zgrep
对压缩过的文件进行操作。文件属性可以通过
chattr
进行设置,它比文件权限更加底层。例如,为了保护文件不被意外删除,可以使用不可修改标记:sudo chattr +i /critical/directory/or/file
使用
getfacl
和setfacl
以保存和恢复文件权限。例如:getfacl -R /some/path > permissions.txt
setfacl --restore=permissions.txt
为了高效地创建空文件,请使用
truncate
(创建稀疏文件),fallocate
(用于 ext4,xfs,btrf 和 ocfs2 文件系统),xfs_mkfile
(适用于几乎所有的文件系统,包含在 xfsprogs 包中),mkfile
(用于类 Unix 操作系统,比如 Solaris 和 Mac OS)。