Linux에서 디렉토리를 루프오버하는 방법
Linux에서 bash로 스크립트를 작성하고 있으며 지정된 디렉토리의 모든 서브 디렉토리 이름을 확인해야 합니다.이러한 디렉토리를 루프 하는 방법(일반 파일도 건너뛰는 방법)
예를 들어 다음과 같습니다.
는 " " " 입니다./tmp/
디렉토리가 ./tmp/A, /tmp/B, /tmp/C
A, B, C를 회수하고 싶습니다.
은 모두 「이것저것」을 하고 있습니다.find
은 필요 을 사용법
for dir in /tmp/*/ # list directories in the form "/tmp/dirname/"
do
dir=${dir%*/} # remove the trailing "/"
echo "${dir##*/}" # print everything after the final "/"
done
cd /tmp
find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n'
간단한 설명:
find
★★★★★★★★★★★★★★★★★」.
디렉토리이며, 이 디렉토리의 .cd
/tmp
(IMHO, 이 기능은 기존 시스템보다 유연합니다./tmp
directly directly에find
명령어를 입력합니다.은 단 한 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」cd
더를-maxdepth 1
★★★★★★★★★★★★★★★★★」-mindepth 1
하다find
되며, only and and and' only 、 。.
-type d
.-printf '%f\n
검색된 폴더 이름(및 새 줄)만 각 히트에 대해 인쇄합니다.
엣보일라!
숨겨진 다이렉트롤리를 포함한 모든 디렉토리를 다음과 같이 루프할 수 있습니다.
for file in */ .*/ ; do echo "$file is a directory"; done
참고: 폴더 내에 숨겨진 디렉토리가 하나 이상 있는 경우에만 목록을 zsh로 사용할 수 있습니다. bash에서는 또한 표시됩니다.
bash가 숨김 디렉토리를 포함할 수 있는 또 다른 방법은 다음과 같습니다.
shopt -s dotglob;
for file in */ ; do echo "$file is a directory"; done
심볼 링크를 제외하려면:
for file in */ ; do
if [[ -d "$file" && ! -L "$file" ]]; then
echo "$file is a directory";
fi;
done
각 솔루션에서 후행 디렉토리명(A, B, C)만 출력하려면 루프 내에서 다음 명령을 사용합니다.
file="${file%/}" # strip trailing slash
file="${file##*/}" # strip path and leading slash
echo "$file is the directoryname without slashes"
예(스페이스를 포함한 디렉토리에서도 동작합니다).
mkdir /tmp/A /tmp/B /tmp/C "/tmp/ dir with spaces"
for file in /tmp/*/ ; do file="${file%/}"; echo "${file##*/}"; done
공백이 있는 디렉토리로 동작합니다.
Sorpigal에서 영감을 얻다
while IFS= read -d $'\0' -r file ; do
echo $file; ls $file ;
done < <(find /path/to/dir/ -mindepth 1 -maxdepth 1 -type d -print0)
원래 투고(스페이스는 사용할 수 없습니다)
Boldewyn에서 영감을 받아: 를 사용한 루프의 예find
명령어를 입력합니다.
for D in $(find /path/to/dir/ -mindepth 1 -maxdepth 1 -type d) ; do
echo $D ;
done
find . -mindepth 1 -maxdepth 1 -type d -printf "%P\n"
제가 가장 자주 쓰는 기술은find | xargs
예를 들어, 이 디렉토리의 모든 파일과 그 서브 디렉토리의 모든 파일을 읽을 수 있도록 하려면 , 다음의 조작을 실시합니다.
find . -type f -print0 | xargs -0 chmod go+r
find . -type d -print0 | xargs -0 chmod go+rx
-print0
NULL로 하다-0
을 분할합니다.option 에서는, option 을 사용합니다.공백이 있는 파일에 사용하는 조합입니다.
는 모든 할 수 .find
그 끝에 붙이고chmod
명령어를 입력합니다.
명령어를 끝부분이 아닌 중간에 인수로 실행할 경우 조금 창의적이어야 합니다.들어 「」, 「」를 실행해야 했습니다.latemk -c
그래서 (Wikipedia에서):
find . -type d -depth 1 -print0 | \
xargs -0 sh -c 'for dir; do pushd "$dir" && latexmk -c && popd; done' fnord
이것은 의 효과가 있다.for dir $(subdirs); do stuff; done
단, 이름에 공백이 있는 디렉토리에는 안전합니다.또, 에의 개별의 콜은stuff
같은 셸로 만들어져 있기 때문에, 제 명령에서는, 현재의 디렉토리로 돌아와,popd
.
구축 가능한 최소한의 bash 루프(ghostdog 74 응답 기준)
for dir in directory/*
do
echo ${dir}
done
많은 파일을 디렉토리별로 압축하다
for dir in directory/*
do
zip -r ${dir##*/} ${dir}
done
for 루프에서 여러 명령을 실행하는 경우 다음 결과를 저장할 수 있습니다.find
와 함께mapfile
(변수 > = 4)를 변수로 하여 어레이를 조사합니다.${dirlist[@]}
공백이 있는 디렉토리에서도 동작합니다.
그find
명령어는 Boldewyn의 답변을 기반으로 합니다.에 대한 상세 정보find
명령어는 여기에서 찾을 수 있습니다.
IFS=""
mapfile -t dirlist < <( find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n' )
for dir in ${dirlist[@]}; do
echo ">${dir}<"
# more commands can go here ...
done
TL;DR:
(cd /tmp; for d in */; do echo "${d%/}"; done)
설명.
외부 프로그램을 사용할 필요가 없습니다.네가 필요한 건 조개껍데기 무늬야제거할 필요가 없도록 하기 위해/tmp
그 후, 당신의 목적에 적합할지 아닐지 모르겠지만, 간단히 설명하겠습니다.
셸 글로브 패턴은 간단히 설명:
*
비어 있지 않은 문자열을 원하는 횟수만큼 일치시킵니다.?
한 글자와 정확히 일치합니다.[...]
괄호 사이의 문자와 일치합니다.도 있습니다.[a-z]
,[A-F0-9]
( ( ) ) 。[:digit:]
,[:alpha:]
등 ) 。[^...]
괄호가 아닌 문자 중 하나를 일치시킵니다.
* 패턴과 일치하는 파일 이름이 없는 경우 셸은 패턴을 변경하지 않고 반환합니다.상기 중 하나가 아닌 임의의 문자 또는 문자열은 그 자체를 나타냅니다.
결과, 「」는*/
는, 「」로 끝나는 임의의 파일명과 합니다./
. /
directory.directory는 됩니다.
마지막 비트는 후행 슬래시를 삭제하는 것입니다.변수 치환을 사용하면 에 포함된 문자열의 끝에서 최단 일치 패턴이 삭제됩니다.여기서 는 유효한 글로벌 패턴입니다.그래서 우리는 글을 쓴다.${d%/}
d
.
find . -type d -maxdepth 1
즉, 검색 결과를 어레이에 넣고 어레이를 반복하여 원하는 작업을 수행합니다.가장 빠르지는 않지만 좀 더 조직적인 사고입니다.
#!/bin/bash
cd /tmp
declare -a results=(`find -type d`)
#Iterate the results
for path in ${results[@]}
do
echo "Your path is $path"
#Do something with the path..
if [[ $path =~ "/A" ]]; then
echo $path | awk -F / '{print $NF}'
#prints A
elif [[ $path =~ "/B" ]]; then
echo $path | awk -F / '{print $NF}'
#Prints B
elif [[ $path =~ "/C" ]]; then
echo $path | awk -F / '{print $NF}'
#Prints C
fi
done
', 하다, 하다'로 정리할 수 있습니다.find -type d | grep "/A" | awk -F / '{print $NF}'
를 인쇄하다
find -type d | grep "/B" | awk -F / '{print $NF}'
를 하다find -type d | grep "/C" | awk -F / '{print $NF}'
C를 인쇄합니다.
언급URL : https://stackoverflow.com/questions/2107945/how-to-loop-over-directories-in-linux
'programing' 카테고리의 다른 글
NSDate에 1일을 추가하려면 어떻게 해야 합니까? (0) | 2023.04.26 |
---|---|
Bash에서 구분 기호의 문자열을 분할하려면 어떻게 해야 합니까? (0) | 2023.04.26 |
Storyboard 프로토타입 셀(Xcode 6, iOS 8 SDK)에서 UICollectionViewCell contentView 프레임의 자동 크기 조정 문제는 iOS 7에서만 발생합니다. (0) | 2023.04.21 |
.NET 설정(app.config/web.config/settings).설정) (0) | 2023.04.21 |
브라우저의 뒤로 버튼 비활성화 (0) | 2023.04.21 |