文件系统中到处都是 MP3 音频文件。你想将它们集中到一个位置,组织好后再复制到音乐播放器中。
解决方案
find 命令可以找出符合要求的所有文件并执行命令,将其移动到指定位置。例如:
find . -name '*.mp3' -print -exec mv '{}' ~/songs \;
讨论
find 命令的语法和其他 Unix 命令不同,其选项并不是那种典型的连字符加上单字母,后面再跟上若干参数。find 命令的选项看起来像是简短的单词 ,依照逻辑顺序出现,并描述要查找哪些文件以及如何处理找到的文件(如果存在的话)。这种像单词一样的选项通常称为谓词(predicate)。
准确地说,它们其实是 find 命令的表达式选项(expression option)、测试条件(test)或操作(action)。
find 命令的第一个参数是待搜索的目录。典型用法是用点号(.)代表当前目录,不过你也可以提供一个目录列表,甚至通过指定根目录(/
)来搜索整个文件系统(只要权限允许)。
示例中的第一个选项(谓词 -name)指定了要搜索的文件模式。其语法和 bash 的模式匹配语法差不多,因此 *.mp3
能够匹配所有以“.mp3”
结尾的文件名。匹配该模式的文件被认为返回的是真(true),接着将其交给下一个谓词进行处理。
不妨这样想:find 会遍历文件系统,将找到的文件名交给谓词测试。如果谓词返回真,就通过。如果返回假,则不再继续往下进行,会接着处理下一个文件名。
谓词 -print
很简单。它总是返回真,同时会将文件名打印到标准输出,因此,能在谓词序列中通过测试而到达这一步的文件都会输出其名称。
-exec 就有点怪异了。到达这一步的文件名都会变成接下来要执行的命令的一部分。剩下一直到 ; 的这部分就是命令,其中的 {}
会被替换成已查找到的文件名。因此,在上面的例子中,如果 find 在 ./music/jazz
子目录中找到名为 mhsr.mp3
的文件,那么要执行的命令就会是:
mv ./music/jazz/mhsr.mp3 ~/songs
所有匹配指定模式的文件都会执行命令。如果找到的文件数量众多,那么命令的执行次数自然也不会少。有时这对系统提出了很高的要求,更好的办法是用 find 查找文件并将文件名输出到数据库,然后将多个参数集中在一起,这样就不用执行那么多次命令了。(但随着计算机的速度越来越快,这个问题已经越来越不是问题。甚至可以说,你的双核或四核处理器正适合干这事。)
酷客网相关文章: