Odpowiedzi:
*/
jest wzorcem, który pasuje do wszystkich podkatalogów w bieżącym katalogu ( *
pasowałby do wszystkich plików i podkatalogów; /
ogranicza to do katalogów). Podobnie, aby wyświetlić listę wszystkich podkatalogów w katalogu / home / alice / Documents, użyjls -d /home/alice/Documents/*/
*/
nie pasuje do żadnych ukrytych folderów. Aby je dołączyć, albo wyraźnie je polub ls -d .*/ */
, albo ustaw dotglob
opcję w Bash.
ls
pojawia się za każdym razem, gdy używasz czegoś, co nie istnieje.
ls */
rozwinąłby się do po prostu ls
, który wyświetlałby wszystkie pliki w bieżącym katalogu. Jestem pewien, że w tym przypadku nie tego chcesz.
echo
Przykład: echo */
, echo */*/
Oto co mam:
cs/ draft/ files/ hacks/ masters/ static/
cs/code/ files/images/ static/images/ static/stylesheets/
ls
tylkoPrzykład: ls -d */
Oto dokładnie to, co dostałem:
cs/ files/ masters/
draft/ hacks/ static/
Lub jako lista (ze szczegółowymi informacjami): ls -dl */
ls
igrep
Przykład: ls -l | grep "^d"
oto co mam:
drwxr-xr-x 24 h staff 816 Jun 8 10:55 cs
drwxr-xr-x 6 h staff 204 Jun 8 10:55 draft
drwxr-xr-x 9 h staff 306 Jun 8 10:55 files
drwxr-xr-x 2 h staff 68 Jun 9 13:19 hacks
drwxr-xr-x 6 h staff 204 Jun 8 10:55 masters
drwxr-xr-x 4 h staff 136 Jun 8 10:55 static
Przykład: for i in $(ls -d */); do echo ${i%%/}; done
oto co mam:
cs
draft
files
hacks
masters
static
Jeśli chcesz mieć znak „/” jako znak kończący, polecenie to: for i in $(ls -d */); do echo ${i}; done
cs/
draft/
files/
hacks/
masters/
static/
3
było dla mnie zauważalnie wolniejsze niż inne. W katalogu testowałem: 1
.012s, 2
.016s, 3
.055s , 4
.021s.
1
Jest moim ulubionym.
time
funkcji Unix. /// Zgadzam się, echo */
jest mądrzejszy niż ls -d */
.
1.
opcja spowoduje poważne problemy w przypadku nazw folderów ze spacjami.
Używam:
ls -d */ | cut -f1 -d'/'
To tworzy pojedynczą kolumnę bez końcowego ukośnika - przydatne w skryptach.
Moje dwa centy.
-1
Opcja na ls
wyjście będzie w formacie pojedynczej kolumny, a także, jak się ls -1 -d */
.
-1
nadal generuje ukośnik końcowy dla każdego wpisu.
.bashrc
jako alias '/'
?
'\/'
| sed -e 's-/$--'
Dla wszystkich folderów bez podfolderów:
find /home/alice/Documents -maxdepth 1 -type d
Dla wszystkich folderów z podfolderami:
find /home/alice/Documents -type d
find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d
przeciwnym razie dołączasz /home/alice/Documents
się. Aby dołączyć dowiązania symboliczne do katalogów, prefiks-L
Zacytowane gwiazdka *
będą interpretowane jako wzorzec (zastępczych) przez powłokę.
Powłoka użyje go do rozszerzenia nazwy ścieżki.
Następnie wygeneruje listę nazw plików pasujących do wzorca.
Prosta gwiazdka będzie pasować do wszystkich nazw plików w PWD (obecny katalog roboczy).
Bardziej złożony wzorzec, który */
będzie pasował do wszystkich nazw plików, które kończą się na /
.
Tak więc wszystkie katalogi. Dlatego polecenie:
echo */
echo ./*/ ### avoid misinterpreting filenames like "-e dir"
zostanie rozszerzony (przez powłokę) do echo
wszystkich katalogów w PWD.
Aby to przetestować: Utwórz katalog ( mkdir
) o nazwie jak test-dir i cd
do niego:
mkdir test-dir; cd test-dir
Utwórz kilka katalogów:
mkdir {cs,files,masters,draft,static} # safe directories.
mkdir {*,-,--,-v\ var,-h,-n,dir\ with\ spaces} # some a bit less secure.
touch -- 'file with spaces' '-a' '-l' 'filename' # and some files:
Polecenie echo ./*/
pozostanie niezawodne nawet w przypadku plików o nieparzystych nazwach:
./--/ ./-/ ./*/ ./cs/ ./dir with spaces/ ./draft/ ./files/ ./-h/
./masters/ ./-n/ ./static/ ./-v var/
Ale spacje w nazwach plików sprawiają, że czytanie jest trochę mylące.
Jeśli zamiast tego echo
używamy ls
, powłoka wciąż rozwija listę nazw plików. Powłoka jest powodem, aby uzyskać listę katalogów w PWD. -d
Opcja ls
sprawia, że listy niniejszy wpis w katalogu zamiast zawartości każdego katalogu (jak przedstawiono domyślnie).
ls -d */
Jednak to polecenie jest (nieco) mniej niezawodne. Nie powiedzie się z wymienionymi powyżej nieparzystymi plikami. Dusi się kilkoma nazwami. Musisz wymazywać jeden po drugim, aż znajdziesz te, które mają problemy.
GNU ls
zaakceptuje --
klawisz „koniec opcji” ( ).
ls -d ./*/ ### more reliable BSD ls
ls -d -- */ ### more reliable GNU ls
Aby wyświetlić listę każdego katalogu w osobnym wierszu (w jednej kolumnie, podobnie do ls -1), użyj:
$ printf "%s\n" */ ### Correct even with "-", spaces or newlines.
Co więcej, możemy usunąć końcowe /
:
$ set -- */; printf "%s\n" "${@%/}" ### Correct with spaces and newlines.
Taka próba:
$ for i in $(ls -d */); do echo ${i%%/}; done
Nie powiedzie się:
ls -d */
), jak pokazano powyżej.IFS
.IFS
).Wreszcie użycie listy argumentów wewnątrz funkcji nie wpłynie na listę argumentów aktualnie działającej powłoki. Po prostu:
$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs
przedstawia tę listę:
--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var
Te opcje są bezpieczne w przypadku kilku rodzajów nieparzystych nazw plików.
tree
Polecenia jest również bardzo przydatny tutaj. Domyślnie wyświetla wszystkie pliki i katalogi na pełnej głębokości, a niektóre znaki ascii pokazują drzewo katalogów.
$ tree
.
├── config.dat
├── data
│ ├── data1.bin
│ ├── data2.inf
│ └── sql
| │ └── data3.sql
├── images
│ ├── background.jpg
│ ├── icon.gif
│ └── logo.jpg
├── program.exe
└── readme.txt
Ale jeśli chcielibyśmy uzyskać tylko katalogi, bez drzewa ascii i pełną ścieżkę z bieżącego katalogu, możesz zrobić:
$ tree -dfi
.
./data
./data/sql
./images
Argumentami są:
-d List directories only.
-f Prints the full path prefix for each file.
-i Makes tree not print the indentation lines, useful when used in conjunction with the -f option.
A jeśli chcesz ścieżkę bezwzględną, możesz zacząć od podania pełnej ścieżki do bieżącego katalogu:
$ tree -dfi "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/data/sql
/home/alice/Documents/images
Aby ograniczyć liczbę podkatalogów, możesz ustawić maksymalny poziom podkatalogów -L level
, np .:
$ tree -dfi -L 1 "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/images
Więcej argumentów można zobaczyć w drzewie drzewa
Jeśli zastanawiasz się, dlaczego dane wyjściowe z 'ls -d * /' dają dwa końcowe ukośniki, takie jak:
[prompt]$ ls -d */
app// cgi-bin// lib// pub//
dzieje się tak prawdopodobnie dlatego, że gdzieś w pliku konfiguracyjnym powłoki lub sesji znajduje się alias polecenia ls do wersji ls, która zawiera flagę -F. Ta flaga dołącza znak do każdej nazwy wyjściowej (nie jest to zwykły plik), wskazując na rodzaj rzeczy. Więc jeden ukośnik pochodzi z dopasowania wzorca „* /”, a drugi ukośnik to dołączony wskaźnik typu.
Aby pozbyć się tego problemu, możesz oczywiście zdefiniować inny alias dla ls. Aby jednak tymczasowo nie wywoływać aliasu, możesz poprzedzić polecenie odwrotnym ukośnikiem:
\ ls -d * /
Po prostu dodaję to do mojego .bashrc
pliku (możesz także wpisać go w wierszu poleceń, jeśli potrzebujesz / chcesz tylko na jedną sesję)
alias lsd='ls -ld */'
wtedy lsd wygeneruje pożądany wynik.
ls
rozwiązanie, w tym dowiązania symboliczne do katalogówWiele odpowiedzi tutaj nie używa ls
(lub używa ich tylko w trywialny sposób ls -d
, używając symboli wieloznacznych do rzeczywistego dopasowania do podkatalogu. Prawdziwe ls
rozwiązanie jest przydatne, ponieważ pozwala na użycie ls
opcji sortowania itp.
ls
Podano jedno użycie rozwiązania , ale robi ono coś innego niż inne rozwiązania, ponieważ wyklucza dowiązania symboliczne do katalogów:
ls -l | grep '^d'
(możliwe przesyłanie potokowe przez sed
lub w awk
celu wyizolowania nazw plików)
W (prawdopodobnie bardziej powszechnym) przypadku, w którym należy uwzględnić dowiązania symboliczne do katalogów, możemy skorzystać z -p
opcji ls
, co powoduje, że dodaje on znak ukośnika do nazw katalogów (w tym również dowiązań symbolicznych):
ls -1p | grep '/$'
lub pozbywanie się końcowych ukośników:
ls -1p | grep '/$' | sed 's/\/$//'
Możemy dodawać opcje do ls
potrzeb (jeśli używana jest długa lista, -1
nie jest już wymagana).
Uwaga: jeśli chcemy końcowych ukośników, ale nie chcemy, aby były podświetlone grep
, możemy hackersko usunąć wyróżnienie, opróżniając faktycznie dopasowaną część wiersza:
ls -1p | grep -P '(?=/$)'
Jeśli ukryty katalog nie musi być wymieniony, oferuję:
ls -l | grep "^d" | awk -F" " '{print $9}'
A jeśli trzeba wymienić ukryte katalogi, użyj:
ls -Al | grep "^d" | awk -F" " '{print $9}'
LUB
find -maxdepth 1 -type d | awk -F"./" '{print $2}'
awk
, spójrz na tę odpowiedź
aby wyświetlić listy folderów bez /
ls -d */|sed 's|[/]||g'
ls -d1 */ | tr -d "/"
Oto czego używam
ls -d1 /Directory/Path/*;
ls -d1 /Directory/Path/*/
Aby wyświetlić tylko katalogi :
ls -l | grep ^d
dla listowania tylko plików :
ls -l | grep -v ^d
lub też możesz zrobić jako: ls -ld * /
Sprawdź, czy pozycja jest katalogiem z test -d
:
for i in $(ls); do test -d $i && echo $i ; done
*/
to wzorzec dopasowania nazwy pliku, który pasuje do katalogów w bieżącym katalogu.
Aby wyświetlić tylko katalogi, podoba mi się ta funkcja:
# long list only directories
llod () {
ls -l --color=always "$@" | grep --color=never '^d'
}
Umieść go w swoim .bashrc.
Przykłady użycia:
llod # long listing of all directories in current directory
llod -tr # same but in chronological order oldest first
llod -d a* # limit to directories beginning with letter 'a'
llod -d .* # limit to hidden directories
UWAGA: pęknie, jeśli skorzystasz z tej -i
opcji. Oto poprawka:
# long list only directories
llod () {
ls -l --color=always "$@" | egrep --color=never '^d|^[[:digit:]]+ d'
}
Do Twojej wiadomości, jeśli chcesz wydrukować wszystkie pliki w wielu wierszach, możesz zrobić, ls -1
aby wydrukować każdy plik w osobnej linii. plik1 plik2 plik3
Częściowo rozwiązałem:
cd "/path/to/pricipal/folder"
for i in $(ls -d .*/); do sudo ln -s "$PWD"/${i%%/} /home/inukaze/${i%%/}; done
ln: «/home/inukaze/./.»: can't overwrite a directory
ln: «/home/inukaze/../..»: can't overwrite a directory
ln: accesing to «/home/inukaze/.config»: too much symbolics links levels
ln: accesing to «/home/inukaze/.disruptive»: too much symbolics links levels
ln: accesing to «/home/inukaze/innovations»: too much symbolics links levels
ln: accesing to «/home/inukaze/sarl»: too much symbolics links levels
ln: accesing to «/home/inukaze/.e_old»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gnome2_private»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gvfs»: too much symbolics links levels
ln: accesing to «/home/inukaze/.kde»: too much symbolics links levels
ln: accesing to «/home/inukaze/.local»: too much symbolics links levels
ln: accesing to «/home/inukaze/.xVideoServiceThief»: too much symbolics links levels
Cóż, to redukuje do mnie, część burmistrza :)
Dodając, aby zatoczyć koło, aby odzyskać ścieżkę każdego folderu, użyj kombinacji odpowiedzi Alberta oraz Gordansa, które powinny być całkiem przydatne.
for i in $(ls -d /pathto/parent/folder/*/); do echo ${i%%/}; done
Wynik:
/pathto/parent/folder/childfolder1/
/pathto/parent/folder/childfolder2/
/pathto/parent/folder/childfolder3/
/pathto/parent/folder/childfolder4/
/pathto/parent/folder/childfolder5/
/pathto/parent/folder/childfolder6/
/pathto/parent/folder/childfolder7/
/pathto/parent/folder/childfolder8/
Za pomocą Perla:
ls | perl -nle 'print if -d;'
Oto, czego używam do wyświetlania tylko nazw katalogów:
ls -1d /some/folder/*/ | awk -F "/" "{print \$(NF-1)}"
Aby odpowiedzieć na pierwotne pytanie, */
nie ma to nic wspólnego z samym sobą ls
; odbywa się to przez powłokę / Bash, w procesie znanym jako globbing .
Właśnie dlatego echo */
i ls -d */
wyprowadzaj te same elementy. ( -d
Flaga powoduje ls
wyświetlanie nazw katalogów, a nie zawartości katalogów.)
Oto odmiana wykorzystująca drzewo, które wyświetla nazwy katalogów tylko w osobnych wierszach, tak, to brzydkie, ale hej, to działa.
tree -d | grep -E '^[├|└]' | cut -d ' ' -f2
lub z awk
tree -d | grep -E '^[├|└]' | awk '{print $2}'
Jest to jednak prawdopodobnie lepsze i zachowa /
nazwę katalogu po.
ls -l | grep "^d" | awk '{print $9}'
file *|grep directory
O / P (na mojej maszynie) -
[root@rhel6 ~]# file *|grep directory
mongo-example-master: directory
nostarch: directory
scriptzz: directory
splunk: directory
testdir: directory
Powyższe dane wyjściowe można bardziej udoskonalić za pomocą cut.
file *|grep directory|cut -d':' -f1
mongo-example-master
nostarch
scriptzz
splunk
testdir
* could be replaced with any path that's permitted
file - determine file type
grep - searches for string named directory
-d - to specify a field delimiter
-f1 - denotes field 1
Najkrótsze polecenie w historii (właściwie włamanie) do wyświetlania tylko katalogów. Wpisz bezwzględną ścieżkę lub ścieżkę względną interesującego katalogu i naciśnij Enter, aby wejść do interesującego katalogu. Teraz wpisz cd
i naciśnij klawisz Tab . Wyświetlane są tylko katalogi.
user@ubuntu:~/Desktop$cd <tab key>
Powyższe polecenie powinno teraz wyświetlać tylko foldery na pulpicie . Rzeczywiście najkrótszy.
-d
tak naprawdę oznacza.