패턴이 포함된 파일을 다운로드 받습니다.
Konto_12334567890-Auszug_YYYY_00MM.pdf
경로에 저장하고 싶습니다.
.../Belege YYYY/Belege YYYY MM/Kontoauszug.pdf
문제는 원래 파일 이름에서 YYYY 연도와 MM 월을 추출하여 새 파일 이름 경로의 폴더 이름에 넣는 방법입니다.
이라는 변수에 파일 이름(경로 제외)이 있습니다 $filename
. $dest
경로와 $filename_new
새 파일 이름 에 대한 또 다른 변수가 있습니다 (이 경우에는 Constant Kontoauszug
).
내 첫 번째 생각은 이전과 포함된 모든 것을 제거 Auszug_
하고 처음 네 자리를 하나의 변수( $year
)에 넣고 마지막 두 자리를 .pdf
다른 변수( $month
)에 넣는 것이었습니다. 어쩌면 더 나은 해결책이 있을 수도 있습니다.
그래서 다음과 같은 경로를 만들 수 있습니다.
DEST="/Users/Belege/Belege $year/Belege $year $month/"
나는 단지 얻고 채워지기만 하면 $year
된다 $month
.
어떻게 해야 하나요?
답변1
zmv
가장 쉬운 방법은 도우미 기능을 통해 이동하는 것입니다.
dtmv () {
mkdir -p -- $2:h && mv -- $@
}
autoload zmv
zmv -n -P dtmv 'Konto_12334567890-Auszug_(*)_00(*).pdf' '/Users/Belege_$1/Belege_$1_$2/Kontoauszug.pdf'
s는 등과 같은 (*)
두 번째 인수에 사용할 수 있는 역참조를 만듭니다 . 여기서는 대신 함수를 실행 합니다 . 이 함수는 디렉터리를 생성한 다음 새로 생성된 디렉터리로 파일을 이동합니다. 각 파일에 대해 원본 파일과 대체 파일이 전달됩니다.$1
$2
zmv
-P
dtmv
mv
노트이는 다음을 -n
의미합니다.시운전따라서 위의 내용은 실행할 명령만 인쇄합니다. -n
실제로 명령을 실행 하려면 제거하세요 . 또한 공백이 있는 파일 이름을 사용하지 않는 것이 좋습니다. 그러나 모든 밑줄을 공백으로 바꾸도록 고집하는 경우:
zmv -n -P dtmv 'Konto_12334567890-Auszug_(*)_00(*).pdf' '/Users/Belege $1/Belege $1 $2/Kontoauszug.pdf'
어떤 이유로 변수를 사용해야 하는 경우 여러 가지 방법으로 사용할 수 있습니다. 파일 이름은 고정된 길이이고 동일한 패턴과 일치하므로 개인적으로 하위 문자열을 사용합니다.
year=${filename: -13:-9}
month=${filename: -6:-4}
:
첫 번째 콜론과 빼기 기호 사이의 공백에 유의하세요. -
또 다른 방법은 문자열을 분할하여 _
(확장자를 제거한 후 :r
) 연도가 세 번째 요소가 되고 월이 처음 두 문자를 뺀 네 번째 요소가 되도록 하는 것입니다.
year=${${(s[_])filename:r}[3]}
month=${${${(s[_])name:r}[4]}:2}
답변2
파일 이름이 항상 표시되는 방식이고 YYYY와 MM이 숫자라고 가정하면 다음을 수행할 수 있습니다.
filename=Konto_12334567890-Auszug_2022_0005.pdf
year=$(cut -d_ -f3 <<<"$filename")
month=$(cut -d_ -f4 <<<"$filename" | sed -e 's/^00//' -e 's/.pdf$//')
mv -- "$filename" "/Users/Belege/Belege $year/Belege $year $month/"
그러나 경로와 파일 이름에 공백을 두는 것이 얼마나 나쁜 생각인지는 아무리 강조해도 지나치지 않습니다. 이로 인해 나중에 이러한 파일을 사용하는 작업이 더 복잡해집니다. 따라서 다음과 같은 작업을 수행할 것을 강력히 권장합니다.
mv -- "$filename" "/Users/Belege/Belege_$year/Belege_${year}_$month/"
답변3
에서 YYYY 및 MM을 추출하는 방법에 대한 보다 일반적인 질문에 대답하려면 Konto_12334567890-Auszug_YYYY_00MM.pdf
다음을 수행할 수 있습니다.
set -o extendedglob
file='Konto_12334567890-Auszug_YYYY_00MM.pdf'
if [[ $file = (#b)*_(<1900-2100>)_00(<1-12>).pdf ]]; then
year=$match[1] month=$match[2]
fi
<1-12>
1~12 범위의 숫자(1, 01, 0000000001 포함)를 나타내는 모든 10진수 시퀀스와 일치합니다. <->
Extendedglob 과 동일하게 하나 이상의 십진수 일치 및 시퀀스입니다 [0-9]##
.
(#b)
b
내부 부품을 (...)
에서 찾을 수 있도록 승인 인용을 활성화합니다 $match
.