programing

Bash에서 ls를 사용하여 디렉토리만 나열하시겠습니까?

starjava 2023. 4. 27. 21:45
반응형

Bash에서 ls를 사용하여 디렉토리만 나열하시겠습니까?

이 명령은 현재 경로에 있는 디렉터리를 나열합니다.

ls -d */

이 정확히 무엇입니까?*/하십니까?

그리고 할 수 ? (를 들어, 위명예절방무지법엇까니입은는하정를로경대서의에령그리고예:ls -d /home/alice/Documents해당 경로의 디렉터리만 나열하시겠습니까?

*/디렉터리의 입니다.*모든 파일 및 하위 디렉터리와 일치합니다./디렉토리로 제한).아래에 모든 하려면 /home/alice/Documents를 합니다.ls -d /home/alice/Documents/*/

이 작업을 수행하는 네 가지 방법, 각각 다른 출력 형식

사용echo

예:echo */,echo */*/
제가 얻은 것은 다음과 같습니다.

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

사용ls 직오의

예:ls -d */
제가 얻은 것은 바로 다음과 같습니다.

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

또는 목록으로 표시(상세 정보 포함): ls -dl */

사용ls그리고.grep

예:ls -l | grep "^d"제가 얻은 것은 다음과 같습니다.

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  

Bash 스크립트(공백이 포함된 파일 이름에는 권장되지 않음)

예:for i in $(ls -d */); do echo ${i%%/}; done
제가 얻은 것은 다음과 같습니다.

cs  
draft  
files  
hacks  
masters  
static

문자로 '/', '(으)', '/', '/', '/', '/', '/'입니다.for i in $(ls -d */); do echo ${i}; done

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

사용자:

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

이렇게 하면 후행 슬래시가 없는 단일 열이 생성되어 스크립트에 유용합니다.

하위 폴더가 없는 모든 폴더의 경우:

find /home/alice/Documents -maxdepth 1 -type d

하위 폴더가 있는 모든 폴더의 경우:

find /home/alice/Documents -type d

신뢰할 수 있는 옵션 4가지(추가)

따옴표로 묶지 않은 별표*셸에 의해 패턴(패턴)으로 해석됩니다.셸에서 경로 이름 확장에 사용합니다.그런 다음 패턴과 일치하는 파일 이름 목록을 생성합니다.

간단한 별표는 PWD(현재 작업 디렉토리)의 모든 파일 이름과 일치합니다.보다 복잡한 패턴은*/로 끝모파이일름치다니로 끝나는 모든 합니다./따라서 모든 디렉터리.그렇기 때문에 다음 명령을 실행합니다.

1.- 에코

echo */
echo ./*/              ### Avoid misinterpreting filenames like "-e dir"

(쉘에 의해) 로 확장될 것입니다.echoPWD의 모든 디렉터리.


이것을.mkdir , ) ,,cd과 같이합니다.

mkdir test-dir; cd test-dir

일부 디렉터리 만들기:

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:

echo ./*/이름이 홀수인 파일이라도 안정적으로 유지됩니다.

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

하지만 파일 이름의 공백은 읽기를 약간 혼란스럽게 만듭니다.


에 대신에 echo우리는 사용합니다.ls셸은 여전히 파일 이름 목록을 확장하고 있습니다.셸은 PWD에서 디렉터리 목록을 가져오는 이유입니다.-d에 대한 선택권.ls각 디렉터리의 내용 대신 현재 디렉터리 항목을 나열합니다(기본값으로 표시됨).

ls -d */

그러나 이 명령은 (어느 정도) 신뢰성이 떨어집니다.위에 나열된 홀수 이름의 파일과 함께 실패합니다.그것은 여러 이름으로 질식할 것입니다.문제가 있는 것을 찾을 때까지 하나씩 지워야 합니다.

2.-ls

GNUls의 끝 션를종료다수니옵락합")을합니다.--키.) 키

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

3.-printf

각 디렉터리를 줄에 나열하려면(ls -1과 유사한 한 열에) 다음을 사용합니다.

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

그리고, 더 좋은 것은, 우리가 추적을 제거할 수 있다는 것입니다./:

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

와 같은 시도.

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

장애 발생:

  • 일부 이름(ls -d */ 있는 위에 이미 나와 있는 것처럼.
  • .IFS.
  • 탭에 은 " " " " " " " " (" " " " " " ( " " ")입니다.IFS).
  • 이름의 각 새 행은 새 에코 명령을 시작합니다.

4.- 기능

마지막으로 함수 내에서 인수 목록을 사용하면 현재 실행 중인 셸의 인수 목록에 영향을 주지 않습니다.간단히

$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs

다음 목록을 제공합니다.

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

이러한 옵션은 여러 유형의 홀수 파일 이름과 함께 사용해도 안전합니다.

이 명령어는 여기에서도 매우 유용합니다.기본적으로 모든 파일과 디렉터리는 완전한 깊이로 표시되며 일부 ASCII 문자는 디렉터리 트리를 표시합니다.

$ tree
.
├── config.dat
├── data
│   ├── data1.bin
│   ├── data2.inf
│   └── sql
|   │   └── data3.sql
├── images
│   ├── background.jpg
│   ├── icon.gif
│   └── logo.jpg
├── program.exe
└── readme.txt

그러나 ASCII 트리 없이 현재 디렉터리의 전체 경로를 사용하여 디렉터리만 가져오려면 다음 작업을 수행할 수 있습니다.

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

인수는 다음과 같습니다.

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

절대 경로를 원하는 경우 현재 디렉토리에 대한 전체 경로를 지정하여 시작할 수 있습니다.

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

를 제한하기 할 수 .-L level항목:

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

에서 더 많은 인수를 확인할 수 있습니다.

'ls -d */'의 출력이 다음과 같은 두 개의 후행 슬래시를 제공하는 이유를 궁금해하는 경우:

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

그것은 아마도 당신의 셸 또는 세션 구성 파일이 ls 명령을 포함하는 ls 버전에 별칭을 붙이기 때문일 것입니다.-F플래그. 이 플래그는 각 출력 이름(일반 파일이 아님)에 해당 항목의 종류를 나타내는 문자를 추가합니다.따라서 하나의 슬래시는 패턴 '*/'과 일치하는 것이고 다른 슬래시는 추가된 유형 표시기입니다.

물론 이 문제를 제거하기 위해 ls에 대해 다른 별칭을 정의할 수 있습니다.그러나 일시적으로 별칭을 호출하지 않으려면 명령 앞에 백슬래시를 추가할 수 있습니다.

\ls -d */

제.ls에 링크를

여기에 있는 많은 답변들은 실제로 사용하지 않습니다.ls (으)ㄹ 수 있는 합니다.ls -d실제 하위 디렉터리 일치에 와일드카드를 사용하는 동안. ls솔루션은 유용합니다, 왜냐하면 그것은 사용을 허용하기 때문입니다.ls정렬 순서 등에 대한 옵션

심볼릭 링크 제외

일단솔션사용을 이용한 ls제공되었지만 디렉터리에 대한 심볼 링크를 제외한다는 점에서 다른 솔루션과는 다른 기능을 수행합니다.

ls -l | grep '^d'

(통관)sed또는awk파일 이름을 분리합니다.

심볼릭 링크 포함

에 대한 링크가 (더 에는, 는 토리에아대하포링는경다디우야있사수니렉습용다할음을우리함어인되는한일더크적볼심반가릭도마▁the▁in▁use▁we아▁thaties▁can다▁shouldlink있디수렉니)습,prob▁cases▁the▁more▁common▁included▁(를 사용할 수 있습니다.-p.ls이를 통해 디렉토리 이름(동일하게 연결된 디렉토리 포함)에 슬래시 문자를 추가할 수 있습니다.

ls -1p | grep '/$'

또는 후행 슬래시를 제거합니다.

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

다음에 옵션을 추가할 수 있습니다.ls따라 (긴, 필에긴따라경우사는되용요이목록긴,▁(경▁as▁the우라따,-1더 이상 필요하지 않음).

참고: 후행 슬래시를 원하지만 강조 표시하지 않으려면grep라인의 실제 일치 부분을 비워 두면 강조 표시를 해킹하여 제거할 수 있습니다.

ls -1p | grep -P '(?=/$)'

현재 디렉터리의 일반 목록은 다음과 같습니다.

ls -1d */

정렬하고 정리하려면 다음을 수행합니다.

ls -1d */ | cut -c 1- | rev | cut -c 2- | rev | sort

대문자로 표시된 문자는 정렬에서 서로 다른 동작을 가집니다.

나는 이것을 나의 것에 추가합니다..bashrc한file ("file" :▁file수)

alias lsd='ls -ld */'

그러면 LSD는 원하는 결과를 만들어 낼 것입니다.

제가 사용하고 있는 것은 다음과 같습니다.

ls -d1 /Directory/Path/*;

숨겨진 디렉터리를 나열할 필요가 없는 경우 다음을 제공합니다.

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

숨겨진 디렉터리를 나열해야 하는 경우 다음을 사용합니다.

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

또는

find -maxdepth 1 -type d | awk -F"./" '{print $2}'

디렉터리만 나열하는 경우:

ls -l | grep ^d

파일만 나열하는 경우:

ls -l | grep -v ^d 

또는 다음과 같이 할 수도 있습니다.

ls -ld */

이거 드셔보세요.모든 리눅스 배포판에서 작동합니다.

ls -ltr | grep drw

ls and awk (grep 없음)

No need to use grep since awk can perform regularexpressino check so it is enough to do this:

ls -l | awk '/^d/ {print $9}'

ls -l이 있는
awk 출력 필터력출
'/^d/'문자 자로시로 d줄 - (사용자 이름) 첫보기줄 - 한권디
{print} 열을 합니다.
{print $9}에서 9번째 열(이름)만 인쇄됩니다.ls -l

매우 간단하고 깨끗합니다.

을 표시하지 않고 표시하려면 다음과 같이 ./:

ls -d */|sed 's|[/]||g'

저는 이 솔루션이 가장 편리하다고 생각했습니다. 목록에 다음과 같이 추가합니다.

find * -maxdepth 0 -type d

차이점은 처음에 ./가 없고 폴더 이름을 사용할 준비가 되었다는 것입니다.

항목이 다음을 포함하는 디렉터리인지 테스트합니다.test -d:

for i in $(ls); do test -d $i && echo $i ; done

참고로, 만약 당신이 모든 파일을 다중선으로 인쇄하고 싶다면, 당신은 할 수 있습니다.ls -1file1 file1 file2 file2 file2 file2 file3

*/현재 디렉터리의 디렉터리와 일치하는 파일 이름 일치 패턴입니다.

디렉터리만 나열하려면 다음 기능이 좋습니다.

# Long list only directories
llod () {
  ls -l --color=always "$@" | grep --color=never '^d'
}

.bashrc 파일에 저장합니다.

사용 예:

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

고참: 다을사깨면다집니용을 하면 깨집니다.-i 다음은 .이에 대한 해결책은 다음과 같습니다.

# Long list only directories
llod () {
  ls -l --color=always "$@" | egrep --color=never '^d|^[[:digit:]]+ d'
}
file * | grep directory

출력(내 기계에서) --

[root@rhel6 ~]# file * | grep directory
mongo-example-master:    directory
nostarch:                directory
scriptzz:                directory
splunk:                  directory
testdir:                 directory

위의 출력은 컷을 사용하여 더 세분화할 수 있습니다.

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

한 줄로 "여기"에서만 디렉터리를 나열합니다.

파일 수와 함께.

for i in `ls -d */`; do g=`find ./$i -type f -print| wc -l`; echo "Directory $i contains $g files."; done

Perl 사용:

ls | perl -nle 'print if -d;'

부분적으로 다음과 같이 해결했습니다.

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

음, 이것은 나로 말하자면, 주요 부분입니다:)

여기 디렉터리 이름을 별도의 줄에만 출력하는 트리를 사용한 변형이 있습니다. 예, 보기 흉하지만 작동합니다.

tree -d | grep -E '^[├|└]' | cut -d ' ' -f2

아니면 어색하게

tree -d | grep -E '^[├|└]' | awk '{print $2}'

그러나 이것은 아마도 더 낫고 유지될 것입니다./디렉터리 이름 뒤에 있습니다.

ls -l | awk '/^d/{print $9}'

당신의 폴더 이름에 9달러의 공간이 있다면 아래 명령을 사용해 보십시오.

ls -l yourfolder/alldata/ | grep '^d' | awk '{print $9" " $10}'

산출량

ls -l yourfolder/alldata/ | grep '^d' | awk '{print $9" " $10}'
testing_Data 
Folder 1

질문에 , 원래질문답면자하에,면,*/와무한와는 아무 .ls그 자체; 그것은 셸/Bash에 의해 수행되며, 글로빙이라고 알려진 과정으로 알려져 있습니다.

이것이 이유입니다.echo */그리고.ls -d */동일한 요소를 출력합니다.(그-d는 발깃제를 .ls디렉터리의 내용이 아닌 디렉터리 이름을 출력합니다.)

모든 폴더의 경로를 검색하려면 Gordans뿐만 아니라 Albert의 답변도 함께 사용합니다.그것은 꽤 유용할 것 같네요.

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

출력:

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

디렉토리 이름만 나열할 때 사용하는 항목은 다음과 같습니다.

ls -1d /some/folder/*/ | awk -F "/" "{print \$(NF-1)}"

언급URL : https://stackoverflow.com/questions/14352290/listing-only-directories-using-ls-in-bash

반응형