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

이 명령은 현재 경로의 디렉토리를 나열합니다. ls -d */

패턴 */은 정확히 무엇을 합니까?

그리고 ls -d /home/alice/Documents그 경로에 디렉토리 만 나열하기 위해 위의 명령에서 절대 경로를 어떻게 줄 수 있습니까?



답변

*/현재 디렉토리의 모든 서브 디렉토리와 일치하는 패턴입니다 ( *모든 파일 서브 디렉토리 일치 하며 디렉토리로 /제한). 마찬가지로 / home / alice / Documents 아래의 모든 하위 디렉토리를 나열하려면ls -d /home/alice/Documents/*/


답변

이 작업을 수행하는 4 가지 방법 (각각 다른 출력 형식)

1. 사용 echo

예 : echo */, echo */*/
여기 내가 가진 것이 있습니다 :

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

2. ls만 사용

예 : ls -d */
여기 내가 얻은 것이 있습니다.

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

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

3. 사용 lsgrep

예 : 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  

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

echo에서 PWD의 모든 디렉토리 로 확장됩니다 .


이를 테스트하려면 : mkdirtest-dir과 같은 이름 의 디렉토리 ( )를 작성 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

GNU ls는 “옵션 끝”( --) 키를 사용합니다.

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).
  • 이름의 각 줄 바꿈은 새로운 에코 명령을 시작합니다.

기능

마지막으로 함수 내에서 인수 목록을 사용해도 현재 실행중인 쉘의 인수 목록에 영향을 미치지 않습니다. 간단히:

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

이 목록을 제시합니다 :

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

이 옵션은 여러 유형의 홀수 파일 이름으로 안전합니다.


답변

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

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

그러나 아스키 트리가없고 현재 디렉토리의 전체 경로를 가진 디렉토리 만 얻으려면 다음을 수행하십시오.

$ 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

더 많은 논쟁은 man tree에서 볼 수 있습니다


답변

‘ls -d * /’의 출력이 왜 다음과 같이 두 개의 슬래시를 제공하는지 궁금해하는 경우 :

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

쉘 또는 세션 구성 파일이 ls 명령을 -F 플래그를 포함하는 ls 버전으로 별칭 지정하기 때문일 수 있습니다. 이 플래그는 각 출력 이름에 일반 파일이 아닌 문자를 추가하여 그 종류를 나타냅니다. 따라서 하나의 슬래시는 패턴 ‘* /’과 일치하는 것이고, 다른 슬래시는 추가 된 유형 표시기입니다.

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

\ ls -d * /