Saya tahu saya bisa melakukan ini untuk mendapatkan daftar nama direktori:
find . -type d -maxdepth 1
Outputnya terlihat seperti ini:
.
./foo
./bar
Saya lebih suka daftar tanpa ./
. Apakah ada cara untuk mendapatkan find untuk menghasilkan hanya nama-nama mentah?
Saya mencoba mengirim daftar ke stat untuk memformatnya tetapi itu hanya memberi saya hasil yang sama:
find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'
foo bar ...
semua dalam satu baris tanpa./
di depan?Jawaban:
Dengan GNU
find
Anda dapat menggunakan-printf
opsi:Seperti dicatat oleh Paweł dalam komentar, jika Anda tidak ingin direktori saat ini terdaftar tambahkan
-mindepth 1
, misalnya:sumber
-printf
opsi apa pun dalam spesifikasi POSIX terbaru dan saya ingin tahu seberapa portabelnya ...printf
opsi yang disebutkan oleh POSIX dan sepertinya tidak didukung oleh beberapafind
versi lainnya . GNU find dapat diinstal di sebagian besar tempat, jadi dalam arti itu portabel.-mindepth 1
jika Anda ingin menyingkirkan.
Memperbarui:
Alternatif yang lebih pendek:
Akan memberi Anda nama, satu per baris, tanpa garis miring
sumber
ls
. Pada saat yang sama saya telah memposting tautan mengapa ini adalah ide yang buruk pada jawaban lain yang dihapus sejak saat itu. Pada saat itu hanya ada 2 jawaban dan alasannya tampak jelas. Saya senang Anda menunjukkan ambiguitas, dan inilah penjelasan saya. Sebagai catatan, saya mengubah downvote saya dalam upvote karena saya setuju dengan jawaban Anda saat ini.\n
dalam nama direktori yang tidak dapat Anda gunakan untuk mengambilnya (yang adalah apa yang Anda lakukan ketika saya menurunkan Anda). Ada beberapa kasus di manals
tidak berperilaku berbahaya dan hampir selalu lebih aman untuk menggunakan cara lain.Menggunakan GNU find, Anda bisa menggunakan -mindepth untuk mencegah ditemukannya cocok dengan direktori saat ini:
Karena Anda tidak melakukan ini secara rekursif, Anda dapat menggunakan bash glob:
Menambahkan trailing / ke glob akan menyebabkan hanya direktori yang cocok.
sumber
*/
meleset file dot dan termasuk symlink. Ini mungkin atau mungkin tidak menjadi masalah.Mari
sed
hapus kedua karakter itu:sumber
Saya lebih suka menggunakan:
sumber
Saya biasanya menggunakan:
Tetapi saya tidak tahu apakah itu cara yang tepat untuk melakukan apa yang Anda inginkan.
sumber
echo */
akan melakukan hal yang sama, lebih atau kurang (itu meleset file dot dan termasuk symlink), tetapi kemudian joachim akan bertanya bagaimana menghapus final/
.Dalam AIX apakah parameter 'maxdepth' tidak berfungsi.
Secara umum ini bekerja untuk saya:
find ./ -type d | cut -d"/" -f2 | sort -u
sumber
Apa yang Anda cari disebut
basename
, mengabaikan struktur direktori unixContoh di bawah ini:
find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;
itu akan mengecualikan untuk output bahkan path dir, menghapus keharusan untuk
cd
sebelum menjalankan perintahBeberapa info tambahan:
Saya akan meneruskan
-exec
sebagai argumen untuk mencari|
(pipa) perintah lain untuk output (menghindari perintah kedua pergi ke setiap baris output, setelah mengatakan bahwa, tergantung pada output itu dapat meningkatkan kinerja untuk skrip)CATATAN:
find
opsi tidak bersifat posisional (-maxdepth memengaruhi tes yang ditentukan sebelum serta yang ditentukan setelahnya).sumber