파일 이름을 기준으로 폴더 생성

파일 이름을 기준으로 폴더 생성

.png예를 들어, 많은 파일이 포함된 폴더가 있습니다 .

Jeff Smith 1.png
Jeff Donald 1.png
Jeff Donald 2.png
Jeff Smith 2.png
Jeff Roberts.png
Kyle Reds.png
Kyle Reds 1.png
Kyle Blues 1.png
Kyle Blues 2.png
Kyle Person.png
etc 
etc

각 고유 이름에 대한 폴더를 생성하는 bash 스크립트를 어떻게 작성합니까?

위의 예에서는 다음 폴더를 얻습니다.

Jeff Smith
Jeff Donald
Kyle Reds
Kyle Blues
Kyle Person 
etc

저는 bash(및 일반적인 코딩)를 처음 접했습니다. 이에 대한 도움을 받고 싶습니다.

감사해요

답변1

그리고 zsh:

#! /bin/zsh -
() { mkdir -p -- ${(u)argv%%( <->|).png}; } *.png

어디:

  • () { code; } arguments.png는 현재 디렉터리( $argv또는 를 $@통해 액세스 가능 code)에 숨겨져 있지 않은 파일 목록을 인수로 사용하는 익명 함수입니다.
  • <->zsh glob 연산자로 모든 십진수 시퀀스와 일치합니다( <first-last>지정되거나 지정되지 않음 first) last.
  • ${(u)array-expansion}배열 확장의 고유 요소로 확장합니다(중복 제거).
  • ${array%%pattern}배열의 요소로 확장하고 끝에서 일치하는 가장 긴 문자열을 제거합니다 pattern.

" <digits>"따라서 여기에서는 선택적 후행 을 제거하여 png 파일로 구성된 각 고유 문자열에 대한 디렉터리를 만듭니다 .png.

bashGNU 도구를 사용하면 다음과 같은 작업을 수행할 수 있습니다.

#! /bin/bash -
export LC_ALL=C # needed for sed to deal with arbitrary byte values, for
                # [0-9] to match on 0123456789 only and for sort -u to report
                # unique records as opposed to one of several that sort the
                # same.

shopt -s failglob # to properly handle the cases where there's no png
set -o pipefail   # ditto, to report a failure exit status in that case.

printf '%s\0' *.png |
  sed -Ez 's/( [0-9]+)?\.png$//' |
  sort -zu |
  xargs -r0 mkdir -p --

또는 GNUism을 피하고 bash 4+를 사용하십시오.

#! /bin/bash -
shopt -s failglob extglob
typeset -A unique
files=(*.png) || exit
for file in "${files[@]}"; do
  file=${file%.png}
  file=${file% +([0123456789])}
  unique[$file]=
done
mkdir -p -- "${!unique[@]}"

현재 디렉토리에 이름이 파일인 경우 " 12.png"디렉토리 이름이 비어 있게 됩니다. 위의 마지막 bash솔루션에서는 연관 배열이 빈 키가 있는 요소를 지원하지 않기 때문에 구문 오류가 발생하며 , 다른 모든 솔루션에서는 이름이 비어 있는 요소를 생성하지 않는 bash오류가 발생합니다 .mkdir

macOS는 기본적으로 GNU 도구와 함께 제공되지 않으며 매우 오래된 버전과 함께 제공됩니다 bash. zsh그러나 항상 존재했습니다. 반드시 사용해야 bash하고 최신 버전이나 GNU 도구를 설치할 수 없는 경우 다음을 대신 사용할 수 있습니다 perl.

#! /bin/bash -
perl -e '
  for (<*.png>) {
    s/\.png\z//;
    s/ \d+\z//;
    $unique{$_} = undef;
  }
  $ret = 0;
  for (keys %unique) {
    unless (mkdir($_) || ($!{EEXIST} && -d $_)) {
      warn "Cannot create $_: $!\n";
      $ret = 1;
    }
  }
  exit $ret;'

( bash이 코드의 구체적인 내용은 설치 sh되어 있는 한 어떤 시스템에서도 작동 하지 않습니다 perl.)

관련 정보