正規表現を使用して、zshスクリプトを介してファイル名を再構成します。

正規表現を使用して、zshスクリプトを介してファイル名を再構成します。

패턴이 포함된 파일을 다운로드 받습니다.

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は、などの(*)2番目の引数に使用できる逆参照を作成します。ここでは代わりに関数を実行します。この関数はディレクトリを作成し、新しく作成されたディレクトリにファイルを移動します。各ファイルに対して、元のファイルと代替ファイルが渡されます。$1$2
zmv-Pdtmvmv

ノートこれは次のことを-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)、年が3番目の要素になり、月が最初の2文字を引いた4番目の要素になるようにすることです。

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と同様に、1つ以上の10進数の一致とシーケンスです[0-9]##

(#b)b内部部品が(...)で見つかるように承認引用を有効にします$match

関連情報