Jak najpierw wyświetlić listę plików i katalogów z katalogami


22

Mam dwa pytania. Po pierwsze, które polecenie wyświetla listę plików i katalogów, a najpierw katalogi?

Drugie pytanie: Chcę skopiować listę plików do jednego katalogu, ale ustaw katalog docelowy jako pierwszą nazwę pliku w poleceniu.


5
lsma --group-directories-firstprzełącznik.
jasonwryan

1
-tjest prawdopodobnie opcją tylko dla GNU, cpktóra pobiera jawny katalog docelowy i dlatego może iść w dowolne miejsce w wierszu poleceń, w tym na początku.
jw013,

Odpowiedzi:


36

Masz GNU?

Wersja GNU lsma --group-directories-first. I cpma -t.

Brak GNU?

W systemach, które nie mają GNU ls, najlepszym rozwiązaniem są dwa kolejne połączenia findz -maxdepth n/ -mindepth ni -type tz odpowiednimi opcjami.

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

W przypadku kopiowania plików, najpierw celem jest napisanie skryptu, który zapisuje pierwszy argument, a następnie używa go shifti dołącza na końcu.

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

Uważaj!

Jeśli planujesz używać ich razem - to znaczy, zbierając listę z ( findlub lsewentualnie używając xargs) i przekazując ją do cp(lub cpopakowania), powinieneś zdawać sobie sprawę z niebezpieczeństw związanych z analizowaniem list plików (w zasadzie nazwy plików mogą zawierać znaki takie jak znaki nowej linii, które mogą zepsuć skrypt). Konkretnie, spojrzenie find„s -execoraz -print0opcji i xargs” s -0opcja.

Alternatywne narzędzie do wydajnego kopiowania drzew katalogów.

Zamiast tego możesz spróbować użyć rsync; ma wiele funkcji, które mogą ułatwić Ci pracę.


To jest świetne. Mówiąc bardziej ogólnie, czy jest jakiś sposób na sprawdzenie, czy mam wersję GNU? (inne niż wypróbowanie opcji --group-directories-first).
Amelio Vazquez-Reina,

3
Możesz pobiec, ls --versionaby dowiedzieć się, który masz.
Shawn J. Goff

6

Najpierw wyświetlenie katalogów spoza GNU ls:

ls -l | sort

Zauważ, że to wyświetli listę wszystkich dziwnych rzeczy, takich jak dowiązania symboliczne, gniazda i rury (oczywiście odpowiednio zgrupowane), ale biorąc pod uwagę, że rzeczy są dość rzadkie, nie powinno to stanowić problemu. W przeciwnym razie byłby to filtrls -l | grep '^(-|d)' | sort


1
+1 sprytniejszy i krótszy niż zaakceptowana odpowiedź. Tyle że tak naprawdę powinno być sort -r.
PythonNut

1
ls -l | sort nie działał dla mnie na komputerze Mac. Najpierw grupuje katalogi, ale nie sortuje ich ani nie sortuje nazw plików, które nastąpiły później.
Ray

również zauważ: używając `| sort` usunie twój kolor, ponieważ jest teraz tekstem.
JayRizzo

5

działa dla bash i zsh

wystarczy dodać alias w ~ / .bashrc lub ~ / .zshrc

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

Również jeśli masz ZSH, możesz użyć narzędzia „k”

k -h --group-directories-first

wprowadź opis zdjęcia tutaj

po prostu zainstaluj go z antygenem, umieszczając następujące polecenie w ~ / .zshrc

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

1
fajna odpowiedź na zaoferowanie aliasu.
рüффп

1

W przypadku systemów innych niż GNU awk może filtrować wszystkie pozostałe pola:

ls -l | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
  • NF == 9: wynik działania ls -lmusi zawierać 9 pól
  • jeśli linia zaczyna się od „d”, drukuje dodatkowy „/”
  • w przeciwnym razie tylko nazwa pliku

Dane wyjściowe wyglądają tak, ls -1ale na pierwszym miejscu są katalogi:

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

Zgodnie z „Długim formatem” strony podręcznika ls, gdy w grę wchodzą inne typy plików, kolejność wyjściowa powinna wynosić:

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

Przydatna funkcja bash (umieść ją w .bash_profile lub .bashrc):

function l1() {
  ls -l $* | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
}

0

W przypadku zshlist ukończeń możesz ustawić list-dirs-firststyl, aby truekatalogi były wyświetlane jako pierwsze. W twoim ~/.zshrc:

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

(tutaj zastosowano do wszystkich widgetów uzupełniających, które go obsługują i do wszystkich poleceń; możesz to ograniczyć, jeśli chcesz, zobacz zstyledokumentację w celu uzyskania szczegółowych informacji)

Jeśli jeszcze tego nie zrobiłeś, upewnij się, że biegniesz, compinstallaby uzyskać kolorowe listy ukończenia z opisami itp. I wszystkimi innymi dodatkami.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.