Lista tylko katalogów używających ls w bash: badanie

To polecenie wyświetla listę katalogów w bieżącej ścieżce: ls -d */

Co dokładnie robi wzór */?

I jak możemy podać ścieżkę bezwzględną w powyższym poleceniu (np. ls -d /home/alice/Documents) dla wypisania tylko katalogów w tej ścieżce?

Author: guaka, 2013-01-16

22 answers

*/ jest wzorcem, który pasuje do wszystkich podkatalogów w bieżącym katalogu (* pasuje do wszystkich podkatalogów i; / ogranicza go do katalogów). Podobnie, aby wyświetlić listę wszystkich podkatalogów w /home / alice/ Documents, użyj ls -d /home/alice/Documents/*/

 767
Author: Gordon Davisson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-16 06:11:28

Cztery sposoby, aby to zrobić, każdy z innym formatem wyjściowym

1. Using echo

Przykład: echo */, echo */*/
Oto co mam:

cs/ draft/ files/ hacks/ masters/ static/  
cs/code/ files/images/ static/images/ static/stylesheets/  

2. Używanie tylko ls

Przykład: ls -d */
Oto dokładnie to, co mam:

cs/     files/      masters/  
draft/  hacks/      static/  

Lub jako lista (ze szczegółowymi informacjami): ls -dl */

3. Używając ls i grep

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  

4. Skrypt Bash (niezalecany dla nazw plików zawierających miejsce.)

Przykład: for i in $(ls -d */); do echo ${i%%/}; done
Oto co mam:

cs  
draft  
files  
hacks  
masters  
static

Jeśli chcesz mieć ' / ' jako znak kończący, komenda będzie brzmiała: for i in $(ls -d */); do echo ${i}; done

cs/  
draft/  
files/  
hacks/  
masters/  
static/
 388
Author: Albert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-04 14:42:21

Używam:

ls -d */ | cut -f1 -d'/'

Tworzy to pojedynczą kolumnę bez ukośnika końcowego-przydatną w skryptach.

Moje dwa centy.
 76
Author: Thomas Altfather Good,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-27 15:40:29

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
 40
Author: at3m,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-23 08:38:11

4 (więcej) niezawodne opcje.

An unquoted gwiazdka * będzie interpretowana jako wzorzec (glob) przez powłokę.
powłoka użyje go w rozszerzeniu pathname.
wygeneruje listę nazw plików, które pasują do wzorca.
prosta gwiazdka dopasuje wszystkie nazwy plików w PWD (obecny katalog roboczy).
bardziej złożony wzorzec jak */ będzie pasował do wszystkich nazw plików, które kończą się /.
tak więc wszystkie katalogi. Dlatego polecenie:

1.- echo.

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:

Komenda echo ./*/ pozostanie niezawodna nawet z nieparzystymi plikami o nazwach:

./--/ ./-/ ./*/ ./cs/ ./dir with spaces/ ./draft/ ./files/ ./-h/
./masters/ ./-n/ ./static/ ./-v var/

Ale spacje w nazwach plików sprawiają, że odczyt jest nieco mylący.


Jeśli zamiast echo, używamy ls, powłoka nadal rozszerza listę nazw plików. Powłoka jest powodem, aby uzyskać listę katalogów w PWD. Opcja -d do ls powoduje, że wyświetla ona aktualną pozycję katalogu zamiast zawartości każdego katalogu (jak jest to domyślnie przedstawione).

ls -d */

Jednak to polecenie jest (nieco) mniej wiarygodne. Nie powiedzie się z nieparzystymi nazwanymi plikami wymienionymi powyżej. Zadławi się kilkoma nazwami. Musisz wymazać jeden po drugim, aż znajdziesz te z problemy.

2.- ls

GNU ls zaakceptuje klucz" end of options " (--).

ls -d ./*/                     ### more reliable BSD ls
ls -d -- */                    ### more reliable GNU ls

3.- printf

Aby wypisać każdy katalog w swojej własnej linii (w jednej kolumnie, podobnie jak ls -1), użyj:

$ printf "%s\n" */        ### Correct even with "-", spaces or newlines.

I jeszcze lepiej, moglibyśmy usunąć trailing /:

$ set -- */; printf "%s\n" "${@%/}"        ### Correct with spaces and newlines.

Taka próba:

$ for i in $(ls -d */); do echo ${i%%/}; done

Nie powiedzie się:

  • niektóre nazwy (ls -d */) Jak już pokazano powyżej.
  • będzie zależeć od wartości IFS.
  • podzieli nazwy na spacje i tabulatory (domyślnie IFS).
  • każdy nowy wiersz w nazwie uruchomi nowe polecenie echo.

4.- Function

Wreszcie, użycie listy argumentów wewnątrz funkcji nie wpłynie na listę argumentów bieżącej uruchomionej 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

Ta opcja jest bezpieczna dla kilku typów nieparzystych nazw plików.

 28
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-16 18:47:18

Polecenie tree jest również bardzo przydatne tutaj. Domyślnie wyświetla wszystkie pliki i katalogi w pełnej głębi, 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 chcemy uzyskać tylko katalogi, bez drzewa ascii i z pełną ścieżką z bieżącego katalogu, można zrobić:

$ tree -dfi
.
./data
./data/sql
./images

Argumenty są następujące:

-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.

I jeśli chcesz mieć ścieżkę absolutną, możesz zacząć od podania pełnej ścieżki do bieżącego katalog:

$ tree -dfi "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/data/sql
/home/alice/Documents/images

I aby ograniczyć liczbę podkatalogów, można ustawić maksymalny poziom podkatalogów za pomocą -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 man tree

 14
Author: Hamish Downer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-16 15:30:39

W przypadku, gdy zastanawiasz się, dlaczego wyjście z 'ls-d * /' daje Dwa końcowe ukośniki, takie jak:

[prompt]$ ls -d */    
app//  cgi-bin//  lib//        pub//

To prawdopodobnie dlatego, że gdzieś pliki konfiguracyjne powłoki lub sesji alias polecenia ls do wersji ls, która zawiera flagę-F. Flaga ta dołącza znak do każdej nazwy wyjściowej (nie jest to zwykły plik) wskazujący rodzaj rzeczy, która jest. Więc jeden Ukośnik jest od pasującym do wzorca'*/' , a drugi Ukośnik jest dołączonym wskaźnikiem typu.

Pozbyć się w tym przypadku można oczywiście zdefiniować inny alias dla ls. Aby jednak tymczasowo nie wywołać aliasu, możesz poprzedzić polecenie ukośnikiem wstecznym:

\ls-d * /

 11
Author: gwideman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-31 19:55:44

Dodaję to do mojego pliku .bashrc (Możesz również wpisać go w linii poleceń, jeśli potrzebujesz/chcesz go tylko na jedną sesję)

alias lsd='ls -ld */'

Wtedy lsd przyniesie pożądany rezultat.

 9
Author: guesty guesterson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-03 00:20:09

Jeśli katalog Ukryty nie musi być wymieniony, oferuję:

ls -l | grep "^d" | awk -F" " '{print $9}'  

I jeśli potrzebne są ukryte katalogi, użyj:

ls -Al | grep "^d" | awk -F" " '{print $9}'

Lub

find -maxdepth 1 -type d | awk -F"./" '{print $2}'
 7
Author: PHP Learner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-29 10:21:43

Wyświetlanie list katalogów Bez /

ls -d */|sed 's|[/]||g'
 6
Author: wholanda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-31 08:38:48

Oto czego używam

ls -d1 /Directory/Path/*;

 5
Author: Banning,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-15 18:10:23

Rzeczywiste rozwiązanie ls, w tym dowiązania symboliczne do katalogów

Wiele odpowiedzi tutaj nie używa ls (lub używa go tylko w trywialnym znaczeniu ls -d, podczas gdy używa symboli wieloznacznych do dopasowania podkatalogu. Prawdziwe rozwiązanie ls jest użyteczne, ponieważ pozwala na użycie opcji ls do sortowania porządku itd.

Wyłączając dowiązania symboliczne

Podano jedno rozwiązanie za pomocą ls, ale robi coś innego od innych rozwiązań, ponieważ wyklucza dowiązania symboliczne do katalogów:

ls -l | grep '^d'

(możliwe przejście przez sed lub awk w celu wyizolowania nazw plików)

Łącznie z dowiązaniami symbolicznymi

W (chyba bardziej powszechnym) przypadku, w którym dowiązania symboliczne do katalogów powinny być dołączone, możemy użyć opcji -p z ls:

ls -1p | grep '/$'

Lub pozbycie się ukośników:

ls -1p | grep '/$' | sed 's/\/$//'

Możemy dodać opcje do ls w razie potrzeby (jeśli używana jest długa lista, -1 nie jest już wymagane).

Uwaga: jeśli chcemy końcowych ukośników, ale nie chcemy, aby były podświetlone przez grep, możemy zhakować podświetlenie, czyniąc rzeczywistą dopasowaną część linii pustą:

ls -1p | grep -P '(?=/$)'
 5
Author: pyrocrasty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-10 21:31:27

Test czy pozycja jest katalogiem z test -d:

for i in $(ls); do test -d $i && echo $i ; done
 4
Author: nmarques,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-30 02:56:45

One-liner do listy katalogów tylko z "tutaj".

Z liczbą plików.

for i in `ls -d */`; do g=`find ./$i -type f -print| wc -l`; echo "Directory $i contains $g files."; done
 2
Author: BHG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-16 21:13:22

*/ jest wzorcem dopasowującym nazwę pliku, który pasuje do katalogów w bieżącym katalogu.

Aby wyświetlać tylko katalogi, podoba mi się Ta funkcja:

# long list only directories
llod () { 
  ls -l --color=always "$@" | grep --color=never '^d'
}
Włóż to do swojego .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: zostanie złamana, jeśli użyjesz opcji -i. Oto poprawka na to:

# long list only directories
llod () { 
  ls -l --color=always "$@" | egrep --color=never '^d|^[[:digit:]]+ d'
}
 2
Author: Robin A. Meade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-25 20:16:01

Dla twojej wiadomości, Jeśli chcesz wydrukować wszystkie pliki w wielu wierszach, możesz wykonać ls -1, który wydrukuje każdy plik w osobnej linii. file1 file2 file3

 2
Author: warfreak92,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-15 14:40:09

Używanie Perla:

ls | perl -nle 'print if -d;'
 2
Author: Paul-Gerhard Woolcock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-20 22:08:22

Tylko do wyświetlania katalogów :

ls -l | grep ^d

Do wyświetlania tylko plików :

ls -l | grep -v ^d 

Lub też możesz zrobić jako: ls-ld */

 2
Author: Vijay Gawas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-13 12:52:58

Częściowo rozwiązałem z:

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 dla mnie część burmistrz:)

 1
Author: inukaze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-28 10:45:46

Dodawanie, aby było pełne, aby pobrać ścieżkę każdego folderu, użyj kombinacji odpowiedzi Alberta, a także Gordanów, które powinny być całkiem przydatne.

for i in $(ls -d /pathto/parent/folder/*/); do echo ${i%%/}; done

Wyjście:

/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/
 1
Author: BilliAm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-30 05:45:28

Spróbuj tego. to zadziała na wszystkich dystrybucjach ls-ltr / grep drw

 1
Author: Raj RD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-22 21:49:19
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 wyjście może być bardziej udoskonalone za pomocą cięcia .

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
 0
Author: AVS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-05 18:56:52