programing

Linux에서 디렉토리를 루프오버하는 방법

mailnote 2023. 4. 21. 21:11
반응형

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

-print0NULL로 하다-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

반응형