日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

對(duì)話 UNIX,第 13 部分: 另外十種命令行組合( 二 )


使得 find 命令具有更好的可移植性
去年曾經(jīng)介紹了許多關(guān)于 find 的使用的內(nèi)容,但是我忽略了其中的一個(gè)選項(xiàng),它使得 find 命令行可以移植到其他操作系統(tǒng) 。
通常,Unix?系統(tǒng)中很少使用帶空格的文件名 。然而,在 Mac OS X 和 Microsoft?Windows?中常常使用更長(zhǎng)的、更具描述性的文件名,并且在 UNIX 中它們也變得越來越多,這是因?yàn)樵摬僮飨到y(tǒng)不斷地積聚更多的桌面特性 。畢竟,將一份報(bào)告保存為 2007 Business Plan 明顯要比 bizplan07.ooo 好得多 。
find 命令使用嵌入的特殊字符列舉長(zhǎng)文件名,但是,如果您希望將 find 與另一個(gè)命令組合使用,那么最安全的方法是,使用 NUL 字符(而不是空格)分隔列表中的每個(gè)文件名 。讓我們來了解其中的差異 。
我們假設(shè)您擁有三個(gè)文件夾,其中一個(gè)或者多個(gè)目錄的名稱中包含空格:
$ ls -1
Business Plan 2007
Expense Report
Pictures from Spain
如果您對(duì)大量的文件運(yùn)行 find 命令,并且將結(jié)果列表傳遞給 xargs,那么文件名中的空格將會(huì)導(dǎo)致錯(cuò)誤:
$ find . -type f -print | xargs ls -1
ls: ./Business: No such file or Directory
ls: ./Expense: No such file or directory
ls: ./Pictures: No such file or directory
ls: 2007: No such file or directory
ls: Plan: No such file or directory
ls: Report: No such file or directory
ls: Spain: No such file or directory
ls: from: No such file or directory
傳遞給 xargs 的結(jié)果是單個(gè)字符串 . ./Business Plan 2007 ./Expense Report ./Pictures from Spain 。在缺省情況下,xargs 將使用空格(或者換行符)對(duì)輸入字符串進(jìn)行劃分,以便產(chǎn)生可以進(jìn)行操作的一個(gè)文件列表 。在這個(gè)示例中,因?yàn)槲募邪崭瘢赃@樣做將會(huì)產(chǎn)生錯(cuò)誤的列表,如前所述 。
一種適當(dāng)?shù)?、可移植的技術(shù)是使用 find -print0,加上 xargs -0,以便使用 NUL 字符對(duì)文件名進(jìn)行劃分 。下面是這種推薦的方法:
$ find . -type f -print0 | xargs -0 ls -1
./Business Plan 2007
./Expense Report
./Pictures from Spain
另外,如果您希望預(yù)覽 xargs 產(chǎn)生的命令,可以添加選項(xiàng) -p 或者 -t 。-p 選項(xiàng)顯示每個(gè)合成的命令,并提示您進(jìn)行確認(rèn) 。輸入大寫的或者小寫的 y 以便運(yùn)行命令,輸入任何其他的內(nèi)容可以拒絕該命令 。-t 選項(xiàng)可以在執(zhí)行每個(gè)命令之前將命令回顯到 stderr 。
更充分地利用 find 命令
盡管 find 非常有用,但是有兩個(gè)隱含的設(shè)置可能會(huì)限制它的結(jié)果(并使得您不知所措):-name 匹配是區(qū)分大小寫的,并且不會(huì)根據(jù)符號(hào)鏈接對(duì)文件系統(tǒng)進(jìn)行遍歷 。
因此,一個(gè)以 find -name '*plan*' 開頭的命令將忽略名稱中包含 Plan 字符串的文件,假設(shè)您的 home 目錄中包含名為 music 的符號(hào)鏈接,而它指向裝入到 /media/music 的 TB 級(jí)的存儲(chǔ)介質(zhì),那么這個(gè)命令將不會(huì)列出您的符號(hào)鏈接 music 。
您可以使用 -iname 覆蓋區(qū)分大小寫的匹配,并且您可以使用 -follow 根據(jù)符號(hào)鏈接進(jìn)行遍歷 。下面是使用了這兩種選項(xiàng)的一個(gè)示例:
$ alias ls='ls -aF'
$ ls -1
bin/
lib/
src/
tomb/
tunes@
$ find . -name '*music*' -type f -print
$ find . -iname '*music*' -type f -print
$ find . -name '*music*' -type f -follow -print
$ find . -iname '*music*' -type f -follow -print
./tunes/Muse/Origin Of Symmetry/04 Hyper Music.m4a
./tunes/Radiohead/OK Computer/04 Exit Music (For A Film).MP3
正如 -F 選項(xiàng)生成的 @ 符號(hào)注釋所表示的,tunes 是一個(gè)符號(hào)鏈接 。要查找名稱中包含字符串“music的任何變體的所有歌曲,您必須使用 -iname *music* 。要遍歷到 tunes 所指向的文件系統(tǒng)層次結(jié)構(gòu),您必須使用 -follow 。

推薦閱讀