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.

Elham abbasi
źródło
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ę.

Shawn J. Goff
źródło
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

Alexander Shcheblikin
źródło
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
DmitrySemenov
źródło
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 } }'
}
clarkttfu
źródło
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.

Stéphane Chazelas
źródło