Saya ingin daftar hanya direktori di jalur yang ditentukan ( ls
tidak memiliki opsi seperti itu). Juga, dapatkah ini dilakukan dengan satu perintah baris?
Saya ingin daftar hanya direktori di jalur yang ditentukan ( ls
tidak memiliki opsi seperti itu). Juga, dapatkah ini dilakukan dengan satu perintah baris?
Jawaban:
Coba ini ls -d */
untuk mendaftar direktori dalam direktori saat ini
ls -al | grep '^d'
- ini jauh lebih ringkas.
*/
memaksa tampilan hanya item yang diakhiri dengan garis miring, yang dalam hal ini akan menjadi direktori, bahkan jika -F
opsi ls
tidak digunakan. Mirip dengan perilaku ls *php
dan cara menampilkan semua file yang diakhiri dengan php
dalam direktori.
echo */
akan melakukan hal yang sama juga
Coba ini:
find . -maxdepth 1 -type d
ls
solusi yang disarankan , find
sepenuhnya bertanggung jawab untuk melakukan pekerjaan (tidak bergantung pada ekspansi wildcard shell, yang dapat memaksakan batas). Itu juga jauh lebih ringkas.
find * -maxdepth 0 -type d
.
find
biasanya dilakukan tetapi hanya menampilkan folder pada kedalaman 1.
Pengikut
find * -maxdepth 0 -type d
pada dasarnya memfilter perluasan '*', yaitu semua entri dalam direktori saat ini, berdasarkan -type d
ketentuan.
Keuntungannya adalah, output sama dengan ls -1 *
, tetapi hanya dengan direktori dan entri tidak dimulai dengan titik
Anda bisa menggunakan ls -d */
atautree -d
Solusi lain adalah globbing tetapi ini tergantung pada shell yang Anda gunakan dan jika globbing untuk direktori didukung.
Misalnya ZSH:
zsh # ls *(/)
tree
?
tree
tidak diinstal secara default (meskipun dalam repositori).
tree
perintah ini bukan perintah asli unix (mohon perbaiki jika saya salah).
Karena ada lusinan cara untuk melakukannya, inilah cara lain:
tree -d -L 1 -i --noreport
tree -d -L 1 -i --noreport | tail -n +2
tree -C -d -L 1 -i --noreport | tail -n+2
ls -l | grep '^d'
Anda dapat membuat alias dan memasukkannya ke file profil
alias ld="ls -l| grep '^d'"
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'
gunakan ini untuk mendapatkan daftar direktori
ls -d */ | sed -e "s/\///g"
find specifiedpath -type d
Jika Anda tidak ingin berulang di subdirektori, Anda dapat melakukan ini sebagai gantinya:
find specifiedpath -type d -mindepth 1 -maxdepth 1
Perhatikan bahwa direktori "dot" (yang namanya dimulai dengan .
) juga akan dicantumkan; tetapi bukan direktori khusus .
juga ..
. Jika Anda tidak ingin direktori "dot", Anda bisa grep
mengeluarkannya:
find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'
mindepth
untuk menyingkirkan .
! 😁
Jawabannya akan tergantung pada shell Anda .
Di zsh
, misalnya, Anda dapat melakukan hal berikut:
echo *(/)
Dan semua direktori dalam direktori kerja saat ini akan ditampilkan.
Lihat man zshexpn
untuk informasi lebih lanjut.
Pendekatan alternatif akan digunakan find(1)
, yang harus bekerja pada sebagian besar rasa Unix:
find . -maxdepth 1 -type d -print
find(1)
memiliki banyak kegunaan, jadi saya pasti akan merekomendasikan man find
.
Anda dapat menggunakan tree
perintah dengan d
saklar untuk mencapai ini.
% tree -d tstdir
tstdir
|-- d1
| `-- d11
| `-- d111
`-- d2
`-- d21
`-- d211
6 directories
lihat man tree
untuk info lebih lanjut.
tree
. Oh well, bukankah maksud saya untuk mencuri guntur siapa pun.
Jika saya memiliki direktori ini:
ls -l
lrwxrwxrwx 1 nagios nagios 11 août 2 18:46 conf_nagios -> /etc/icinga
-rw------- 1 nagios nagios 724930 août 15 21:00 dead.letter
-rw-r--r-- 1 nagios nagios 12312 août 23 00:13 icinga.log
-rw-r--r-- 1 nagios nagios 8323 août 23 00:12 icinga.log.gz
drwxr-xr-x 2 nagios nagios 4096 août 23 16:36 tmp
Untuk mendapatkan semua direktori, gunakan -L untuk menyelesaikan tautan:
ls -lL | grep '^d'
drwxr-xr-x 5 nagios nagios 4096 août 15 21:22 conf_nagios
drwxr-xr-x 2 nagios nagios 4096 août 23 16:41 tmp
Tanpa -L:
ls -l | grep '^d'
drwxr-xr-x 2 nagios nagios 4096 août 23 16:41 tmp
direktori conf_nagios tidak ada.
Ini berhasil bagi saya:
`ls -F | grep /`
(Tapi, saya beralih ke echo */
seperti yang disebutkan oleh @nos)
Berikut solusi lain yang memperlihatkan direktori yang ditautkan. Saya sedikit lebih suka karena ini adalah subset dari output "normal" ls-l:
ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always
Dalam bash:
ls -d */
Akan mencantumkan semua direktori
ls -ld */
akan mendaftar semua direktori dalam bentuk panjang
ls -ld */ .*/
akan mendaftar semua direktori, termasuk direktori tersembunyi, dalam bentuk panjang.
Saya baru saja beralih ke zsh (MacOS Catalina), dan menemukan bahwa:
ls -ld */ .*/
tidak lagi berfungsi jika direktori saat ini tidak mengandung direktori tersembunyi.
zsh: no matches found: .*/
Ini akan mencetak kesalahan di atas, tetapi juga akan gagal mencetak direktori apa pun.
ls -ld *(/) .*(/)
Juga gagal dengan cara yang sama.
Sejauh ini saya telah menemukan bahwa ini:
ls -ld */;ls -ld .*/
adalah solusi yang layak. Ini ;
adalah pemisah perintah. Tetapi itu berarti bahwa jika tidak ada direktori tersembunyi, itu akan mendaftar direktori, dan masih mencetak kesalahan tanpa direktori tersembunyi:
foo
bar
zsh: no matches found: .*/
ls
adalah perintah shell untuk daftar isi direktori saat ini
-l
adalah bendera untuk menentukan bahwa Anda ingin daftar di Longford (satu item per baris + banyak informasi keren lainnya)
-d
adalah bendera untuk mendaftar semua direktori "sebagai file" dan tidak secara rekursif
*/
adalah argumen 'daftar semua file yang diakhiri dengan slash'
*
adalah perintah regex sederhana untuk "apa pun", jadi */
meminta shell untuk mendaftar "apa pun yang berakhiran dengan '/'"
Lihat man ls
untuk informasi lebih lanjut.
Saya menempatkan ini:
alias lad="ls -ld */;ls -ld .*/"
di .zshrc saya, dan sepertinya berfungsi dengan baik.
CATATAN: Saya juga menemukan itu
ls -ld .*/ 2> /dev/null
tidak berfungsi, karena masih mencetak sterr ke terminal. Saya akan memperbarui jawaban saya jika / ketika saya menemukan solusi.
Daftar direktori yang panjang
Direktori daftar
- ls -d * /