2009-02-01 101 views
23

在Free BSD上使用tcsh shell,是否有遞歸列出所有文件和目錄的方法,包括文件的所有者,組和相對路徑?如何遞歸列出所有文件和目錄

LS -alR接近,但它並沒有顯示在每個文件前面的相對路徑,它顯示了一個即分組

owner% ls -alR 
total 0 
drwxr-xr-x 3 owner group 102 Feb 1 10:50 . 
drwx------+ 27 owner group 918 Feb 1 10:49 .. 
drwxr-xr-x 5 owner group 170 Feb 1 10:50 subfolder 

./subfolder: 
total 16 
drwxr-xr-x 5 owner group 170 Feb 1 10:50 . 
drwxr-xr-x 3 owner group 102 Feb 1 10:50 .. 
-rw-r--r-- 1 owner group  0 Feb 1 10:50 file1 
-rw-r--r-- 1 owner group  0 Feb 1 10:50 file2 

頂部的路徑是什麼,我想是輸出,如:

owner group ./relative/path/to/file 

accepted answer to this question顯示了一個文件的相對路徑,但不顯示所有者和組。

回答

24

如何:

find . -exec ls -dl \{\} \; | awk '{print $3, $4, $9}' 
+0

如果路徑中有空格,awk會創建另一個字段,看起來會失敗。 有沒有辦法從$ 9打印到行尾? – Ben 2009-02-02 16:42:49

+0

就是你!你*可以*將ls輸出讀入函數,通過參數移動你的方式並使用$ @來讀取「剩下的部分」,但老實說,它已經變得很混亂,我只需要編寫一個Python實用程序,然後做它正確的方式,而不是.. – 2009-02-02 17:11:46

+0

或嘗試一個由瘦身或克里斯建議的Perl解決方案。 – 2009-02-02 17:32:27

10

find接近:

find . -printf "%u %g %p\n" 

還有 「%P」,如果你想的路徑是相對的,其將刪除的文件名前綴,到指定的目錄。

請注意,這是GNU查找,我不知道BSD查找是否也支持-printf。

-4

使用shell腳本。或者一個Perl腳本。例如Perl腳本(因爲它更容易爲我做的):

#!/usr/bin/perl 
use strict; 
use warnings; 
foreach(`find . -name \*`) { 
    chomp; 
    my $ls = `ls -l $_`; 
    # an incomprehensible string of characters because it's Perl 
    my($owner, $group) = /\S+\s+\S+\s+(\S+)\s+(\S)+/; 
    printf("%-10s %-10s %s\n", $owner, $group, $_); 
} 

也許有點超過其他答案詳細,但應該做的伎倆,並應保存你不必記住什麼類型。 (代碼未經測試)

4

如果您喜歡使用Perl,請不要將其用作shell命令的包裝。在本地Perl中執行它更快,更便攜,更有彈性。另外它避免了臨時正則表達式。

use File::Find; 
use File::stat; 

find (\&myList, "."); 

sub myList { 
    my $st = lstat($_) or die "No $file: $!"; 

    print getgrnam($st->gid), " ", 
      getpwuid($st->uid), " ", 
      $File::Find::name, "\n"; 
} 
18

使用。很少有Linux發行版默認安裝它(在這些暗天只有GUI :-),但它始終在標準存儲庫中可用。它應該是適用於* BSD也看到http://mama.indstate.edu/users/ice/tree/

用途:

tree -p -u -g -f -i 

tree -p -u -g -f 

或檢查手冊頁許多其他有用的參數。

6

你已經有了這樣的作品,但引用你應該能夠做到這一點的BSD系統的答案(我測試過它在Mac):

find . -ls 
14

作品中的Linux Debian的:

find $PWD -type f  
相關問題