Cara daftar file dan direktori dengan direktori terlebih dahulu


22

Saya punya dua pertanyaan. Pertama, perintah mana yang mencantumkan file dan direktori, tetapi daftar direktori terlebih dahulu?

Pertanyaan kedua: Saya ingin menyalin daftar file ke direktori tunggal, tetapi menjadikan direktori target nama file pertama dalam perintah.


5
lsmemiliki --group-directories-firstsaklar.
jasonwryan

1
-tmungkin merupakan opsi hanya-GNU untuk cpitu yang mengambil direktori target eksplisit dan karenanya dapat pergi ke mana saja di baris perintah, termasuk awal.
jw013

Jawaban:


36

Punya GNU?

Versi gnu lsmemiliki --group-directories-first. Dan cpsudah -t.

Tidak ada GNU?

Pada sistem yang tidak memiliki gnu ls, taruhan terbaik Anda adalah dua panggilan berurutan finddengan -maxdepth n/ -mindepth ndan -type tdengan opsi yang sesuai.

find . -maxdepth 1 -mindepth 1 -type d
find . -maxdepth 1 -mindepth 1 \! -type d

Untuk menyalin file, dengan target terlebih dahulu, Anda harus menulis skrip yang menyimpan argumen pertama, lalu menggunakan shift, dan menambahkan argumen hingga akhir.

#!/bin/sh
target="$1"
shift
cp -r -- "$@" "$target"

Awas!

Jika Anda berencana untuk menggunakan ini bersama-sama - yaitu, mengumpulkan daftar dari findatau ls(mungkin dengan menggunakan xargs) dan meneruskannya ke cp(atau cppembungkus), Anda harus mengetahui bahaya apa yang ada di parsing daftar file (pada dasarnya, nama file dapat mengandung karakter seperti baris baru yang dapat mengacaukan skrip Anda). Secara khusus, lihat ke find's -execdan -print0pilihan dan xargs' s -0pilihan.

Alat alternatif untuk menyalin pohon direktori secara efisien.

Anda mungkin ingin melihat menggunakan rsyncsebagai gantinya; ini memiliki banyak fungsi yang mungkin membuat pekerjaan Anda lebih mudah.


Ini bagus. Secara umum, apakah ada cara untuk mengetahui apakah saya memiliki versi GNU? (selain mencoba opsi --group-directories-first).
Amelio Vazquez-Reina

3
Anda dapat berlari ls --versionuntuk mencari tahu mana yang Anda miliki.
Shawn J. Goff

6

Mendaftar direktori pertama untuk non-GNU ls:

ls -l | sort

Catatan, ini akan mencantumkan semua kumpulan hal-hal aneh lainnya seperti symlink, soket dan pipa juga (tentu saja dikelompokkan dengan tepat), tetapi mengingat hal-hal itu cukup langka yang seharusnya tidak menjadi masalah. Kalau tidak, filternya akanls -l | grep '^(-|d)' | sort


1
+1 pintar dan lebih pendek dari jawaban yang diterima. Kecuali itu memang seharusnya sort -r.
PythonNut

1
ls-l | semacam tidak bekerja untuk saya di Mac. Ini mengelompokkan direktori terlebih dahulu tetapi tidak mengurutkannya dan juga tidak mengurutkan nama file yang mengikuti.
Ray

juga perhatikan: menggunakan `| sort` akan menghapus warna Anda seperti sekarang teks.
JayRizzo

4

bekerja untuk bash dan zsh

cukup tambahkan alias di ~ / .bashrc atau ~ / .zshrc

# Colorize the ls output ##
alias ls='LC_COLLATE=C ls -h --group-directories-first --color=auto'

Juga jika Anda memiliki ZSH, Anda dapat menggunakan utilitas "k"

k -h --group-directories-first

masukkan deskripsi gambar di sini

cukup instal dengan antigen, dengan meletakkan yang berikut ke ~ / .zshrc

antigen bundle reduxionist/k --branch=add-sort-options

1
jawaban yang bagus untuk menawarkan alias.
рüффп

0

Untuk zshdaftar penyelesaian, Anda dapat mengatur list-dirs-firstgaya agar truedirektori ditampilkan terlebih dahulu. Di Anda ~/.zshrc:

zstyle ':completion:*' list-dirs-first true

(di sini berlaku untuk semua widget penyelesaian yang mendukungnya dan untuk semua perintah; Anda dapat membatasi itu jika mau, lihat zstyledokumentasi untuk detailnya)

Jika Anda belum melakukannya, pastikan untuk menjalankannya compinstalljuga untuk mendapatkan daftar lengkap berwarna, dengan deskripsi, dll, dan semua barang lainnya.


0

Untuk non-GNU, awk dapat memfilter semua bidang lainnya:

ls -l | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
  • NF == 9: output dari ls -lharus berisi 9 bidang
  • jika baris dimulai dengan 'd', cetak ekstra '/'
  • jika tidak hanya nama file

Outputnya terlihat seperti ls -1tetapi dengan direktori pertama:

node_modules/
src/
e2e/
angular.json
tslint.json
package.json
README.md

Menurut "The Long Format" halaman manual ls, ketika jenis file lain terlibat, urutan output harus:

   s     Socket link.
   p     FIFO.
   l     Symbolic link.
   d     Directory.
   c     Character special file.
   b     Block special file.
   -     Regular file.

Fungsi bash yang berguna (taruh di .bash_profile atau .bashrc) Anda:

function l1() {
  ls -l $* | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.