2009-02-01 45 views
23

Sử dụng vỏ tcsh trên BSD miễn phí, có cách nào đệ quy liệt kê tất cả các tệp và thư mục bao gồm chủ sở hữu, nhóm và đường dẫn tương đối đến tệp không?Cách đệ quy liệt kê tất cả các tệp và thư mục

ls -alR đến gần, nhưng nó không hiển thị các đường dẫn tương đối trước của mỗi tập tin, nó cho thấy con đường ở phía trên cùng của một nhóm tức là

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 

Những gì tôi muốn là đầu ra như sau:

owner group ./relative/path/to/file 

accepted answer to this question hiển thị đường dẫn tương đối vào tệp nhưng không hiển thị chủ sở hữu và nhóm.

Trả lời

24

Làm thế nào về điều này:

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

Dường như điều này không thành công nếu có bất kỳ dấu cách nào trong đường dẫn vì awk sẽ tạo một trường khác. Có cách nào để in từ $ 9 đến cuối dòng không? – Ben

+0

Đúng vậy! Bạn * có thể * đọc đầu ra ls thành một hàm, chuyển theo cách của bạn mặc dù các đối số và sử dụng $ @ để đọc "phần còn lại của dòng", nhưng thành thật mà nói, nó trở nên lộn xộn đến mức tôi chỉ viết một tiện ích Python nhỏ Thay vào đó, hãy thực hiện theo cách thích hợp .. –

+0

Hoặc thử một trong các giải pháp Perl được đề xuất bởi slim hoặc Chris. –

10

find đến gần:

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

Ngoài ra còn có "% P", mà loại bỏ các tiền tố từ tên tập tin, nếu bạn muốn những con đường trở thành tương đối vào thư mục được chỉ định.

Lưu ý rằng đây là GNU tìm thấy, tôi không biết nếu BSD tìm cũng hỗ trợ -printf.

+1

BSD thực sự không hỗ trợ -printf, nhưng thật dễ dàng để cài đặt GNU tìm ~/bin/gnufind;) –

-4

Sử dụng tập lệnh hệ vỏ. Hoặc một kịch bản Perl. Ví dụ về tập lệnh Perl (vì tôi dễ dàng thực hiện việc này hơn):

#!/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, $_); 
} 

Có lẽ hơi phức tạp hơn các câu trả lời khác, nhưng nên thực hiện thủ thuật và nên lưu bạn phải nhớ những gì cần nhập. (Mã chưa được kiểm tra.)

+0

Có vẻ như OP muốn có câu trả lời "[u] hát tcsh shell trên Free BSD". –

4

Nếu bạn ưa thích sử dụng Perl, đừng sử dụng nó làm trình bao bọc xung quanh các lệnh shell. Làm nó trong Perl bản địa nhanh hơn, di động hơn và linh hoạt hơn. Ngoài ra, nó tránh các regexes ad-hoc.

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

Sử dụng cây. Vài bản phân phối Linux cài đặt nó theo mặc định (trong những ngày tối này tối chỉ của GUIs :-), nhưng nó luôn luôn có sẵn trong kho tiêu chuẩn. Nó nên có sẵn cho * BSD cũng, xem http://mama.indstate.edu/users/ice/tree/

Sử dụng:

tree -p -u -g -f -i 

hoặc

tree -p -u -g -f 

hoặc kiểm tra man page của nhiều đối số hữu ích khác.

6

Bạn đã có câu trả lời mà làm việc, nhưng để tham khảo bạn sẽ có thể làm điều này trên BSDs (Tôi đã thử nghiệm nó trên một mac):

find . -ls 
14

trình trong Linux Debian:

find $PWD -type f  
+0

Hoạt động hoàn hảo trên Mac OS X Mountain Lion. Cảm ơn. – Norris

+1

Nếu đường dẫn thư mục hiện tại của bạn chứa dấu cách, hãy đặt '$ PWD' với dấu ngoặc kép:' find "$ PWD" -type f' –

+0

Chỉ trong trường hợp, nó cũng hoạt động trên Git Bash từ GitHub cho Windows. –

Các vấn đề liên quan