
1 つのディレクトリに大量のファイルが保存されており、ファイル名の最初の文字に基づいてサブフォルダに分類したいと考えています。
つまり、最初の単語 (数字 7 文字) がすべて異なる .pdf ファイルが何千もあります。
また、同じディレクトリ内に、最初の単語が異なる 7 桁の数字を持つフォルダーが何千個もあります。
すべての .pdf を、最初の単語 (7 文字) が同じフォルダーに移動しようとしています。
したがって、基本的に PDF ファイルをチェックし、同じディレクトリ内で最初の 7 桁の数字が同じフォルダーが既に存在するかどうかを確認し、存在する場合は .pdf をそのフォルダーに移動するバッチ ファイルが必要です。
.pdf のフォルダーが存在しない場合は、.pdf ファイルの最初の 7 文字に基づいてフォルダーが作成されます。
たとえば、同じディレクトリに「1617832_XXXXXXXX_XXX.pdf」という名前の PDF と「1617832_XXXXXXXX」という名前のフォルダがある場合、「1617832_XXXXXXXX_***.pdf」を既存のフォルダ「1617832_XXXXXXXX」に移動する必要があります。ただし、「1617832_XXXXXXXX」フォルダが存在しない場合は、「1617832」(ファイルの最初の 7 文字) というタイトルのフォルダを作成する必要があります。
その後、次の .pdf「4530834__XXXXXXXXX_XXX.pdf」に移動し、フォルダーをチェックして、最初の単語 (7 文字) が同じ一致するフォルダーがあるかどうかを確認し、ファイルをそのフォルダーに移動します (存在する場合は、新しいフォルダーを作成します)。
これに近いものの、実行に時間がかかり、フォルダーが存在しない場合にはフォルダーを作成しない唯一のバッチは次のとおりです。
@echo on
setlocal enabledelayedexpansion
cls
pushd c:\folders\
for /f "tokens=*" %%1 in ('dir /a-d /b *') do (
set filename=%%1&set dirname=!filename:~0,7!
for /f "tokens=*" %%A in ('dir /ad /b') do (
set dirid=%%A&set dirid=!dirid:~0,7!
if "!dirid!" equ "!dirname!" move %%1 %%A
)
)
これをより効率的かつ効果的に行う方法はありますか?
答え1
これをテストしてください:
@echo off
setlocal EnableDelayedExpansion
REM Put here the path where the PDFs are:
set "Source=%userprofile%\Desktop\test"
for %%a in ("%Source%\*.PDF") do (
set "File=%%~na"
for /d %%b in ("%Source%\*") do (
set "Folder=%%~nb"
If "!File:~0,7!"=="!Folder:~0,7!" Move "%%a" "%%b"
)
if Exist "%%a" md "!Source!\!File:~0,7!"& move /y "%%a" "!Source!\!File:~0,7!"
)
答え2
- 更新しましたこのコメントを考慮すると:はい、最初の7文字が一致する2つのフォルダがある場合は、最初の7文字が同じである両方のフォルダにファイルを移動します。
移動コマンドは使用できません。移動を行うと、移動後に最初の 7 文字が一致する別のフォルダーにそのファイル (移動されたファイル) のコピーを作成できなくなるためです。コマンドでは、ファイルを移動するのではなく、コピーを作成する必要があります。
@echo off && setlocal enabledelayedexpansion
cd /d "O:\Path\Operations\Blank\Blanky\Blank Blank" && cls
for /f tokens^=* %%i in ('dir /a:d .\* /b ')do set "_folder=%%~ni" && if exist ".\%%~ni*.pdf" (
for /f tokens^=* %%F in ('dir /a:d /b ".\!_folder:~0,7!*"')do copy ".\%%~ni*.pdf" "%%~dpnF\." )
for %%F in (*.pdf)do set "_file=%%~nF" && call set "_file=!_file:~0,7!" && (
if not exist .\!_file!\. md .\!_file!\ && copy /y "%%~dpnxF" ".\!_file!\." )
:: Deleting these files was copied to multiple folders instead of being moved to folder...
(echo/ if exist .\*.pdf del .\*.pdf /q /f ) & %__APPDIR__%timeout.exe -1 & endlocal && goto :EOF
まずフォルダを処理して、一致するファイルがあるかどうかを確認します。その後、フォルダ内の残りのファイルと宛先がないファイルを確認します。
すべてのファイルがそれぞれのフォルダにコピーされている場合は、これを削除する必要があります。echo /
指示:
(エコー/存在する場合 .\*.pdf del .\*.pdf /q /f ) & %__APPDIR__%timeout.exe -1 & endlocal && goto :EOF