패턴이 포함된 파일을 다운로드 받습니다.
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
-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
)、年が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
。