我經常使用Bash中的優秀find程序列出帶有某些過濾器的文件。例如,在一個Subversion(SVN)的工作拷貝,有時我真希望遞歸列出所有文件,但不包括.svn
子目錄如下:Bash命令遞歸列出文件,但按分類排序
find . -name '.svn' -prune -o -type f -print
今天,我想要做類似的事情,但我也想影響列出了目錄內容的順序:我希望「普通」文件後跟子目錄(然後是遞歸內容)。這似乎沒有選擇。
ls(list)命令有一個遞歸列表選項。此命令有許多排序選項,包括按文件名列出,訪問時間,大小等,但不分類,但-p
選項將註釋目錄。
現在,我可能會寫,例如,一個Python腳本來完成我想要的。但是,find
已經做了幾乎所有我想要的。通常在Bash shell中,可以將程序合併爲你想要的:每個程序(如find
,sort
,uniq
,ls
,wc
)執行一個簡單的任務,但是做得很好。並非每個程序都需要進行排序,因爲sort
可以排序。所以,真的,我只是好奇......
我的問題是,你知道是否有一種方法可以做我想做的事情:只需組合Bash程序來篩選和排序遞歸文件列表?
例如,find
給我的文件在此,字母,次序:
a.txt
b\file1.txt
b\subdir\file2.txt
b\then_file3.txt
c.txt
d\file4.txt
e.txt
,但我寧願他們在這個順序,其中每個目錄中,普通的文件按字母順序排列第一,其次是目錄,再按照字母順序:
a.txt
c.txt
e.txt
b\file1.txt
b\then_file3.txt
b\subdir\file2.txt
d\file4.txt
(我是Windows用戶,但我在Cygwin運行的Bash shell)
謝謝。
這有效,但會發出警告。他們可能被'-nowarn'選項關閉。 – 2009-11-05 23:28:13
謝謝!我認爲這可能會以某種方式。 那麼,我的SVN過濾示例就是 找不到。 -name'.svn'-prune -o -type d -exec find {} -type f -nowarn -maxdepth 1 \; – Rhubbarb 2009-11-06 00:08:24
當我嘗試這樣做時,結果未排序(由dir和dir級別內)。 – 2009-11-06 01:28:30