web-dev-qa-db-ja.com

名前に基づいてファイルをフォルダに移動します

移動する必要のある.pdfファイルと.jpgファイルがいくつかあります。

彼らはこのような名前が付けられています

002-054*.pdf
042-021*.pdf

*いくつかの接辞です。

今、私はこれらのファイルをこのようなフォルダに移動したいと思います

002\002 - 054\002-054*.pdf
042\042 - 021\042-021*.pdf

いくつかのフォルダはすでに存在しますが、この命名スキームでは002\002 - 054 Some Name\

2番目のコードスニペットに記載されているフォルダーがまだ存在しない場合にのみ、フォルダーを作成したいと思います。それらがすでに存在する場合は、ファイルを対応するフォルダーに移動したいだけです。

グーグルで何かをまとめることができました

@echo off
for %%F in (*.pdf *.jpg) do call :subr "%%F"
exit /b

:subr
set filename=%1
move %1 %filename:~1,3%\%filename:~1,7%\
exit /b

しかしこれはすでに存在するフォルダを考慮しません。それを達成するための最良の方法は何でしょうか?

1
Claypenguin

サブルーチンに数行追加するだけです:-

:subr
set filename=%1
Rem Check for existence of directories in target path
if not exist %filename:~1,3% md %filename:~1,3%
if not exist %filename:~1,3%\%filename:~1,7% md %filename:~1,3%\%filename:~1,7%
Rem Now the move can proceed
move %1 %filename:~1,3%\%filename:~1,7%\
exit /b

作成する必要のあるディレクトリパスの1つと同じ名前の既存のファイルがある場合、これは失敗します。名前に拡張子を追加したり、ファイルを別の場所に移動したりするなど、このケースの処理方法を決定する必要があります。

2
AFH

フォルダを現在のディレクトリに作成する必要がある場合
および第2レベルのフォルダーの番号の間に-があります:

@echo off
for /f "delims=" %%F in (
  'Dir /b *.pdf *.jpg^|findstr "^[0-9][0-9][0-9]-[0-9][0-9][0-9]" '
) do call :subr "%%F"
exit /b

:subr
set "file=%~n1"
set "fold=%file:~0,3%\%file:~0,3% - %file:~4,3%\"
if not exist "%fold%" md "%fold%"
move %1 "%fold%"

およびdir |findstrの変更は、番号パターン999-999で始まるファイルのみが処理されるようにするためのものです。
mdは中間フォルダーを作成するため、必要なmdは1つだけです。

0
LotPings