Bagaimana cara membatasi kedalaman untuk daftar file rekursif?

346

Apakah ada cara untuk membatasi kedalaman daftar file rekursif di linux?

Perintah yang saya gunakan saat ini adalah:

ls -laR > dirlist.txt

Tapi saya punya sekitar 200 direktori dan masing-masing punya 10 direktori. Jadi itu akan memakan waktu terlalu lama dan terlalu banyak sumber daya sistem.

Yang saya benar-benar tertarik adalah informasi kepemilikan dan izin untuk subdirektori tingkat pertama:

drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk  
drwxr--r-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk/htdocs  
drwxr--r-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk  
drwxr-xrwx 14 proftp root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk/htdocs  
drwxr-xrwx 14 proftp root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk/htdocs  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk/htdocs
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk/cgi-bin

EDIT:

Pilihan akhir perintah:

find -maxdepth 2 -type d -ls >dirlist
Jon
sumber
3
Bisakah Anda juga seperti itu ls -la /var/www/vhosts/*?
KevinO

Jawaban:

494

Lihat -maxdepthbenderafind

find . -maxdepth 1 -type d -exec ls -ld "{}" \;

Di sini saya menggunakan 1 sebagai kedalaman level maks, -type dberarti hanya menemukan direktori, yang kemudian ls -ldmencantumkan isi, dalam format panjang.

Alberto Zaccagni
sumber
2
Karena OP ingin mengetahui izin direktori itu sendiri, Anda harus menambahkan -dopsi ls.
Peter van der Heijden
@ Peter van der Heijden: Saya baru saja menulis findbagian untuk menyelesaikan masalah utamanya. Pokoknya terima kasih saya menambahkannya.
Alberto Zaccagni
3
Saya menggunakan -print0dan xargs -0banyak. Contoh:find . -maxdepth 1 -type d -print0 | xargs -0 ls -d
Chris K
2
Oh ya, kelihatannya keliru tahu, itu belum 6 tahun yang lalu: D Saya sudah mengomentari stackoverflow.com/a/25618630/57095 bahwa itu harus menjadi jawaban yang diterima.
Alberto Zaccagni
ahhh maxdepth, apakah ada opsi kedalaman?
Alexander Mills
95

Manfaatkan findopsi

Sebenarnya tidak ada eksekutif dari /bin/ls dibutuhkan;

Temukan memiliki opsi yang melakukan hal itu:

find . -maxdepth 2 -type d -ls

Untuk melihat hanya satu level subdirektori yang Anda minati, tambahkan -mindepthke level yang sama dengan -maxdepth:

find . -mindepth 2 -maxdepth 2 -type d -ls


Gunakan format output

Ketika detail yang ditampilkan harus berbeda, -printfdapat menampilkan detail tentang file dalam format khusus; Untuk menampilkan izin simbolis dan nama pemilik file, gunakan -printfdengan %Mdan %udi format.

Saya perhatikan nanti Anda menginginkan informasi kepemilikan penuh, yang termasuk grup. Gunakan %gdalam format untuk nama simbolik, atau %Guntuk id grup (seperti juga %Uuntuk id pengguna numerik)

find . -mindepth 2 -maxdepth 2 -type d -printf '%M %u %g %p\n'

Ini akan memberi Anda hanya detail yang Anda butuhkan, untuk file yang tepat.

Saya akan memberikan contoh yang menunjukkan nilai sebenarnya berbeda untuk pengguna dan grup:

$ sudo find /tmp -mindepth 2 -maxdepth 2 -type d -printf '%M %u %g %p\n'
drwx------ www-data  www-data /tmp/user/33
drwx------ octopussy root     /tmp/user/126
drwx------ root      root     /tmp/user/0
drwx------ siegel    root     /tmp/user/1000
drwxrwxrwt root      root     /tmp/systemd-[...].service-HRUQmm/tmp

(Diedit agar mudah dibaca: indentasi, persingkat baris terakhir)


Catatan tentang kinerja

Meskipun waktu eksekusi sebagian besar tidak relevan untuk jenis perintah ini, peningkatan kinerja cukup besar di sini untuk membuatnya layak untuk menunjukkannya:

Kita tidak hanya menghemat membuat proses baru untuk setiap nama - tugas besar - informasi bahkan tidak perlu dibaca, seperti yang findsudah diketahui.

Volker Siegel
sumber
9
Ini harus menjadi jawaban yang diterima, jauh lebih baik daripada jawaban saya.
Alberto Zaccagni
1
@AlbertoZaccagni Saya kira kami menyukai jawaban singkat untuk segera menyelesaikan pekerjaan.
anddero
65

tree -L 2 -u -g -p -d

Mencetak pohon direktori dalam format yang cantik hingga kedalaman 2 (-L 2). Pengguna cetak (-u) dan grup (-g) dan izin (-p). Cetak hanya direktori (-d). tree memiliki banyak opsi berguna lainnya.

Sameer
sumber
12
pohon adalah cinta. pohon adalah kehidupan.
yosefrow
Cukup tree -L 2 xxx/atau tree -L 2 -d xxx/cukup untuk beberapa kasus.
Eric Wang
1

Yang saya benar-benar tertarik adalah informasi kepemilikan dan izin untuk subdirektori tingkat pertama.

Saya menemukan solusi mudah saat bermain ikan saya, yang sesuai dengan kebutuhan Anda dengan sempurna.

ll `ls`

atau

ls -l $(ls)
recolic
sumber