İlk önce dizinleri olan dosyalar ve dizinler nasıl listelenir?


22

İki sorum var. İlk olarak, hangi komut dosyaları ve dizinleri listeler, ancak önce dizinleri listeler?

İkinci soru: Bir dosya listesini tek bir dizine kopyalamak istiyorum, ancak hedef dizini komuttaki ilk dosya adı yapmak istiyorum.


5
lsbir --group-directories-firstanahtarı var.
jasonwryan

1
-tcpaçık bir hedef dizini alan ve muhtemelen komut satırında herhangi bir yere gidebileceğiniz, başlangıç ​​dahil olmak üzere, GNU’ya özgü bir seçenek .
jw013

Yanıtlar:


36

GNU'nuz var mı?

Gnu sürümü lsvar --group-directories-first. Ve cpvardır -t.

GNU yok mu?

Yok sistemlerde gnu var lsen iyi bahis için iki ardışık çağrıları olduğunu findile -maxdepth n/ -mindepth nve -type tuygun seçeneklerle.

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

Dosyaları kopyalamak için önce hedefle birlikte, ilk argümanı kaydeden bir komut dosyası yazmanız gerekir, sonra kullanır shiftve argümanı sonuna ekler.

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

Dikkat et!

Bunları birlikte kullanmayı planlıyorsanız - yani, listeyi findveya ls(muhtemelen kullanarak xargs) toplama ve listeye cp(veya bir cpsarmalayıcıya) geçirme , dosya listelerini ayrıştırmada hangi tehlikelerin bulunduğunu bilmelisiniz (temelde, dosya isimleri betiğinizi bozabilecek yeni satırlar gibi karakterler içerebilir). Özellikle, find' -execve -print0seçenek ve seçenek xargs' içine bakın -0.

Dizin ağaçlarını verimli bir şekilde kopyalamak için alternatif bir araç.

Bunun rsyncyerine kullanarak bakmak isteyebilirsiniz ; işinizi kolaylaştıracak çok fazla işlevselliğe sahiptir.


Bu harika. Daha genel olarak, GNU versiyonuna sahip olup olmadığımı bilmenin bir yolu var mı? (seçeneği denemek dışında --group-directories-first).
Amelio Vazquez-Reina

3
ls --versionHangisine sahip olduğunuzu bulmak için koşabilirsiniz .
Shawn J. Goff

6

GNU olmayanlar için ilk önce dizinleri listeleme ls:

ls -l | sort

Bu, sembolik bağlantılar, soketler ve borular gibi diğer bütün garip şeyleri de (elbette uygun şekilde gruplandırılmış, elbette) listeleyecektir, ancak bunun bir sorun olmaması gereken oldukça nadirdir. Aksi takdirde, filtrels -l | grep '^(-|d)' | sort


1
+1 akıllıca ve kabul edilen cevaptan daha kısa. Bunun dışında olması gerektiği gibi sort -r.
PythonNut

1
ls -l | sort benim için Mac'te işe yaramadı. Önce dizinleri gruplandırır, ancak bunları sıralamaz ya da izleyen dosya adlarını sıralamaz.
Ray

ayrıca not: `| sort`, metninizi şimdi olduğu gibi kaldırır.
JayRizzo

4

bash ve zsh için çalışıyor

sadece ~ / .bashrc veya ~ / .zshrc içine takma ad ekleyin.

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

Ayrıca ZSH'niz varsa, "k" yardımcı programını kullanabilirsiniz.

k -h --group-directories-first

görüntü tanımını buraya girin

Sadece ~ / .zshrc içine koyarak, antijen ile yükleyin

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

1
Takma adı sunmak için güzel bir cevap.
рüффп

0

İçin zshbireyin tamamlama listeleri, Belirleyebileceğiniz list-dirs-firststil truedizinleri ilk gösterilmesini için. İçinde ~/.zshrc:

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

(burada onu destekleyen tüm tamamlama widget'larına ve tüm komutlar için uygulanır; isterseniz kısıtlamayı zstyleayrıntılarıyla ilgili belgelere bakın)

Henüz yapmadıysanız, compinstalltamamlama listelerini renkli, açıklamaları, vb. Ve diğer tüm güzelliklerle birlikte almak için de çalıştığınızdan emin olun .


0

GNU olmayanlar için, awk diğer tüm alanları filtreleyebilir:

ls -l | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
  • NF == 9: çıktısı ls -l9 alan içermelidir
  • satır 'd' ile başlıyorsa, fazladan '/' basar
  • aksi takdirde sadece dosya adı

Çıktı benziyor ls -1ama dizinleri ilk koymadan:

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

Man sayfasının "Uzun Biçimi" ne göre, diğer dosya türleri dahil edildiğinde, çıktı sırası şöyle olmalıdır:

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

Kullanışlı bir bash işlevi (.bash_profile veya .bashrc içine yerleştirin):

function l1() {
  ls -l $* | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.