2013-01-23 20 views
5

我有一個基於在bash中運行「find」命令的結果的目錄列表。作爲一個例子,發現的結果是文件:如何在bash中按字母順序排列find(包括嵌套目錄)的結果

test/a/file 
test/b/file 
test/file 
test/z/file 

我要那麼它顯示爲輸出排序:

test/file 
test/a/file 
test/b/file 
test/z/file 

有什麼辦法來find命令中的結果進行排序,或通過將結果分類排序?

回答

9

如果你有發現的GNU版本,試試這個:

find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F '\0' '{print $3}' 

在循環使用這些文件的名稱,做

find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F '\0' '{print $3}' | while read file; do 
    # use $file 
done 

find命令打印三件事爲每個文件: (1)其目錄,(2)目錄樹中的深度,以及(3)其全名。通過在輸出中包含深度,我們可以使用sort -ntest/a/file以上的test/file進行排序。最後,我們使用awk去掉前兩列,因爲它們僅用於排序。

使用\0作爲三個字段之間的分隔符允許我們處理其中包含空格和製表符的文件名(但不幸的是,不包括換行符)。

$ find test -type f 
test/b/file 
test/a/file 
test/file 
test/z/file 
$ find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F'\0' '{print $3}' 
test/file 
test/a/file 
test/b/file 
test/z/file 

如果無法修改find命令,那就試試這個令人費解的更換:

find test -type f | while read file; do 
    printf '%s\0%s\0%s\n' "${file%/*}" "$(tr -dc/<<< "$file")" "$file" 
done | sort -t '\0' | awk -F'\0' '{print $3}' 

它做同樣的事情,與${file%/*}被用來獲取文件的目錄名和tr命令用於計算斜槓的數量,這相當於文件的「深度」。

(我當然希望有一個更簡單的答案在那裏。什麼你問似乎並沒有那麼難,但我消隱一個簡單的解決方案。)

+1

我使用這個命令作爲我的bash腳本的一部分。最好是我希望我可以按照以下方式做一些事情: 'for file in find ... |排序...' – Ken

+0

@Ken看我的編輯。 '找到... |而讀文件'應該優於'for $(find ...)'中的文件。後者不是空白安全的,速度較慢,並且如果文件名太多以適應命令行,則會出錯。 –

-1

嘗試。作爲參考,它首先排序第二個字段第二個字符。它只存在於文件中,並且具有反向的r意味着它是第一個,之後它將排序第二個字段的第一個字符。 [-t是場deliminator,-k是關鍵]

find test -name file |sort -t'/' -k2.2r -k2.1 

更多信息做一個info sort。有很多不同的方法可以使用-t和-k來獲得不同的結果。

+0

這是一個奇怪的具體和方便的排序示例文件名。這不是一個通用的解決方案。 –