디렉터리에서 파일을 읽고 확장자별로 해당 폴더에 정리합니다.

디렉터리에서 파일을 읽고 확장자별로 해당 폴더에 정리합니다.

다음 이름을 가진 여러 디렉터리를 만들 수 있는 bash 함수 스크립트를 만들려고 합니다. 또한 파일을 확장자별로 적절한 폴더에 정리하려고 했습니다(예: .jpg는 사진으로, .doc는 문서로, .gif는 미디어로 등). 첫 번째 부분은 좋지만 디렉토리가 생성된 후 두 번째 부분은 나를 혼란스럽게 합니다.

    #!/bin/bash
    echo "Creating directory categories"

    function make_folder 
    {
        cd -; cd content; sudo mkdir ./$1
    }

    make_folder "documents"
    make_folder "other"
    make_folder "pictures"
    make_folder "media"

    echo "Directories have been made"; cd -
    exit

    ext="${filename##*.}" #set var ext to extension of files

    find ./random -name | #find and list all files in random folder
                          #pipe results of find into if statement

    if ext == ["jpg"; "jpeg"; "png"] #move ".jpg", etc to new destination
         then
           mv /path/to/source /path/to/destination

    elif ext == [".gif"; ".mov"] #move ".gif", etc to new destination 
         then
           mv /path/to/source /path/to/destination
    else                         #move other files into to new destination
           mv /path/to/source /path/to/destination
    fi

답변1

내 머리 꼭대기에서 나는 "case"문을 사용하게 될 것입니다.

case "$FILE" in
    *.jpg|*.jpeg)
        mv "$FILE" to where you want it
        ;;
    *.gif|*.mov)
        mv "$FILE" to where you want it
        ;;
    *)
        echo "Unmanaged file type: $FILE, skipping"
        ;;
 esac

...하지만 루프 컨테이너로 포장해야 하며 확실히 find를 사용하고 싶다면 적합할 수 있습니다.

 find <your stuff> | 
     while read FILE
     do
         ...case statement goes here
     done

그냥 내 $0.02

건배! / 다니엘

답변2

귀하의 make_folder기능은 불필요하게 복잡합니다. 이러한 현재 디렉토리 변경은 귀하의 삶을 더욱 복잡하게 만들 뿐입니다. 무엇보다도 다음과 같은 작업이 필요하지 않습니다 sudo. 루트로 디렉토리를 만드는 이유는 무엇입니까? 그냥 전화하세요 mkdir.

mkdir documents other pictures media

디렉토리가 이미 존재하는 경우에도 스크립트가 작동하도록 하려면 다음을 사용하십시오 mkdir -p.

mkdir -p documents other pictures media

를 사용하려면 find이름을 인쇄한 다음 구문 분석하지 마세요. find원하는 코드를 실행 해 보세요 -exec. 간단한 프로그램을 호출하는 것 외에도 쉘을 호출할 수도 있습니다. 의 경우 <code>sh -c '<em>shell code</em>'쉘 코드 다음의 매개변수는 sh쉘 코드에서 로 사용할 수 있습니다 $0.변수 대체에는 항상 큰따옴표를 사용하세요.. 껍질 조각에서 확장을 통해 구별하는 자연스러운 방법은 다음을 사용하는 것입니다.사례파일 이름을 기준으로 구성됩니다. 나는 사용한다매개변수 확장${0##*/}파일의 기본 이름을 가져오기 위해 구성되었습니다 (마지막 슬래시 앞의 모든 항목을 제거). 이 테스트는 [ -e "$destination_file" ]다른 디렉토리에서 이동된 동일한 이름의 파일을 덮어쓰지 않도록 대상 파일이 이미 존재하는지 테스트합니다.

find random -exec sh -c '
  case "$0" in
    *.gif|*.png|*.jpg) destination_directory=pictures;;
    *) destination_directory=other;;
  esac
  destination_file="$destination_directory/${0##*/}"
  if [ -e "$destination_file" ]; then mv "$0" "$destination_file"; fi
' {} \;

또 다른 방법은 대상별로 파일을 복사하는 것인데, 파일 수가 많으면 속도가 느려질 수 있지만 작성하는 것이 훨씬 간단합니다. Linux에서는 GNU 유틸리티 덕분에 다음과 같이 간단합니다.

find random \( -name '*.gif' -o -name '*.png' -o -name '*.jpg' \) -exec mv -n -t pictures {} +

다른 대상 디렉터리에도 마찬가지입니다. 작업 속도를 높이려면 마지막에 일괄 호출 +대신 사용하세요 .;find -execmv

그러나 실제로 bash나 zsh에서 수행 중인 작업에는 find.**와일드카드재귀적 디렉터리 탐색에 사용됩니다.

shopt -s globstar # necessary in bash to enable **
mv -n random/**/*.gif random/**/*.png random/**/*.jpg pictures/

모든 파일을 대상 디렉토리에 직접 배치한다고 가정합니다. 디렉터리 계층 구조를 재현하려는 경우에는 이야기가 다르며 다른 도구가 적합할 것입니다.

관련 정보