.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
.
bash
GNU 도구를 사용하면 다음과 같은 작업을 수행할 수 있습니다.
#! /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
.)