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?
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/*/
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/
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.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
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.
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
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 * /
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.
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}'
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'
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/*;
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 '(?=/$)'
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
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
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'
}
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
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;'
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 */
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:)
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/
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
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
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