답변:
*/
현재 디렉토리의 모든 서브 디렉토리와 일치하는 패턴입니다 ( *
모든 파일 및 서브 디렉토리 와 일치 하며 디렉토리로 /
제한). 마찬가지로 / home / alice / Documents 아래의 모든 하위 디렉토리를 나열하려면ls -d /home/alice/Documents/*/
ls
존재하지 않는 무언가를 사용할 때마다 그 오류가 발생 합니다.
ls */
가 없는 경우 just로 확장되어 ls
현재 디렉토리의 모든 파일이 나열됩니다. 나는 그것이 당신이 원하는 경우가 아니라고 확신합니다.
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
예 : 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/
3
나를 위해 다른 사람들보다 눈에 띄게 느 렸습니다. 내가 테스트 한 디렉토리에서 : 1
.012s, 2
.016s, 3
.055s , 4
.021s.
1
. 내가 가장 좋아하는 말입니다 .
time
유닉스 함수를 사용했습니다. /// 나는 echo */
보다 영리하다 ls -d */
.
1.
옵션은 공백이있는 폴더 이름을 처리 할 때 큰 문제를 일으 킵니다.
나는 사용한다:
ls -d */ | cut -f1 -d'/'
이렇게하면 슬래시가없는 단일 열이 만들어져 스크립트에 유용합니다.
내 두 센트
-1
옵션 ls
은 단일 열 형식으로도 출력됩니다 ls -1 -d */
.
-1
여전히 모든 항목에 대해 슬래시를 출력합니다.
.bashrc
별칭으로 추가 할 때 어떻게 추가 '/'
합니까?
'\/'
| sed -e 's-/$--'
하위 폴더가 없는 모든 폴더의 경우 :
find /home/alice/Documents -maxdepth 1 -type d
하위 폴더가 있는 모든 폴더의 경우 :
find /home/alice/Documents -type d
find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d
그렇지 않으면 당신은 포함 /home/alice/Documents
자체를. 디렉토리에 대한 심볼릭 링크를 포함하려면-L
인용 부호로 둘러싸이지 않은 별표 *
쉘 패턴 (글로브)로 해석됩니다.
쉘은 경로명 확장에서이를 사용합니다.
그런 다음 패턴과 일치하는 파일 이름 목록을 생성합니다.
간단한 별표는 PWD (현재 작업 디렉토리)의 모든 파일 이름과 일치합니다.
로 */
끝나는 모든 파일 이름과 일치 하는보다 복잡한 패턴 입니다 /
.
따라서 모든 디렉토리. 그 이유는 다음과 같습니다.
echo */
echo ./*/ ### avoid misinterpreting filenames like "-e dir"
쉘 echo
에서 PWD의 모든 디렉토리 로 확장됩니다 .
이를 테스트하려면 : mkdir
test-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 */
그러나이 명령은 신뢰성이 떨어집니다. 위에 나열된 이상한 이름의 파일로 실패합니다. 여러 이름으로 질식합니다. 문제가있는 것을 찾을 때까지 하나씩 지워야합니다.
GNU ls
는 "옵션 끝"( --
) 키를 사용합니다.
ls -d ./*/ ### more reliable BSD ls
ls -d -- */ ### more reliable GNU ls
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 * /
이 .bashrc
파일 을 내 파일에 추가하기 만하면 됩니다 (한 세션 동안 필요 / 원하는 경우 명령 줄에 입력해도됩니다).
alias lsd='ls -ld */'
그런 다음 lsd는 원하는 결과를 생성합니다.
ls
디렉토리에 대한 심볼릭 링크를 포함한 실제 솔루션여기에있는 많은 답변은 실제로 사용하지 않습니다 ls
(또는 ls -d
실제 하위 디렉토리 일치에 와일드 카드를 사용하는 동안 사소한 의미로만 사용하십시오 . 정렬 순서 등 ls
의 ls
옵션을 사용할 수 있기 때문에 진정한 솔루션이 유용합니다 .
하나의 솔루션을 사용 ls
했지만 디렉토리에 대한 심볼릭 링크 를 제외 한다는 점에서 다른 솔루션과 다른 점이 있습니다 .
ls -l | grep '^d'
( 파일 이름을 통해 파이핑 sed
하거나 awk
파일 이름을 분리 할 수 있음)
디렉토리에 대한 심볼릭 링크가 포함되어야하는 (아마도 더 일반적인) 경우에는 -p
옵션을 사용하여 ls
디렉토리 이름에 슬래시 문자를 추가 할 수 있습니다 (심볼 링크 포함)
ls -1p | grep '/$'
또는 후행 슬래시를 제거하십시오.
ls -1p | grep '/$' | sed 's/\/$//'
ls
필요에 따라 옵션을 추가 할 수 있습니다 (긴 리스팅을 사용하는 -1
경우 더 이상 필요하지 않음).
참고 : 우리가 경우 원하는 슬래시를 후행하지만, 어떻게 그들에 의해 강조하지 grep
, 우리가 hackishly 비우 라인의 실제 일치하는 부분을하여 강조 표시를 제거 할 수 있습니다 :
ls -1p | grep -P '(?=/$)'
숨겨진 디렉토리를 나열 할 필요가 없으면 다음을 제공합니다.
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}'
awk
이 답변을보십시오.
여기 내가 사용하는 것이 있습니다
ls -d1 /Directory/Path/*;
ls -d1 /Directory/Path/*/
*/
현재 디렉토리의 디렉토리와 일치하는 파일 이름 일치 패턴입니다.
디렉토리 만 나열하려면이 기능이 마음에 듭니다.
# 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'
}
참고로, 모든 파일을 여러 줄로 ls -1
인쇄하려면 각 파일을 별도의 줄로 인쇄하는 작업을 수행 할 수 있습니다 . file1 file2 file3
나는 부분적으로 해결했다.
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
글쎄, 이것은 시장 부분으로 나에게 줄어든다 :)
전체 폴더를 만들기 위해 모든 폴더의 경로를 검색하려면 Albert의 답변과 Gordans의 조합을 사용하여 매우 유용합니다.
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 | perl -nle 'print if -d;'
여기에 별도의 줄에서만 디렉토리 이름을 출력하는 트리를 사용하는 변형이 있습니다. 그렇지만 추악하지만 작동합니다.
tree -d | grep -E '^[├|└]' | cut -d ' ' -f2
또는 awk와 함께
tree -d | grep -E '^[├|└]' | awk '{print $2}'
그러나 이것은 아마도 더 좋을 것이고 /
after 디렉토리 이름을 유지할 것 입니다.
ls -l | grep "^d" | awk '{print $9}'
file *|grep directory
O / P (내 컴퓨터에서)-
[root@rhel6 ~]# file *|grep directory
mongo-example-master: directory
nostarch: directory
scriptzz: directory
splunk: directory
testdir: directory
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
디렉토리 만 나열하는 가장 짧은 명령 (실제로 핵). 원하는 디렉토리의 절대 경로 또는 상대 경로를 입력하고 Enter를 눌러 원하는 디렉토리를 입력하십시오. 이제 키를 입력 cd
하고 누르 십시오 . 디렉토리 만 표시됩니다.
user@ubuntu:~/Desktop$cd <tab key>
위 명령은 이제 Desktop의 폴더 만 표시해야합니다 . 실제로 가장 짧습니다.
-d
사실을 의미한다.