Переместить датированные файлы в соответствующие им датированные папки

840
Michael

У меня есть файлы .pdf с датой в конце их названия, например, «BINNAWAY - WERRIS CK - 483.94 - 120612».

У меня есть папки, названные в честь дат каждого из этих файлов, например, «12-06-2012».

Как я могу переместить все файлы в соответствующие папки на основе даты в их имени?

Я на Windows XP.

Буду признателен за любые советы.

Спасибо

3

3 ответа на вопрос

1
user309970

@and31415 Your code has worked on some of the files. But there are many others where it hasn't worked because all files are not in the format <name1> - <name2> - <some numbers> - <date> as assumed. Some may be in the format <name1> - <some numbers> - <date> or something else slightly different. However, all files will end with - <date>, in the following possible arrangements: "- 120612", "- 120612 (1)", "- 120612 (2)", or "- No Date". How can I make it so that only the text after the last hyphen is considered?

Appreciate all your help.

Michael

0
and31415

The following batch script assumes that:

  • All file names are in the format <name> - [...] - <some numbers> - <date>.
  • All years are in the range 2000-2099.

Just copy and paste the code in a new text file and save it as MoveFiles.cmd (or whatever as long as you keep the .cmd extension).

@echo off setlocal setlocal enabledelayedexpansion for /r %%A in (*.pdf) do ( set date= call :getLastToken "%%~nA" for /f "tokens=1" %%B in ("!last!") do set date=%%~B echo "!date!"|findstr "^\"[0-3][0-9][0-1][0-9]*\"$" >nul if !errorlevel! == 0 ( set targetFolder=!date:~0,2!-!date:~2,2!-20!date:~4,2! if not exist "!targetFolder!\" md "!targetFolder!" move "%%~fA" "!targetFolder!" >nul )) endlocal & exit /b :getLastToken set "str=%~1" :loop for /f "tokens=1* delims=-" %%A in ("%str%") do ( set "last=%%A" set "str=%%B" ) if defined str goto :loop exit /b 

How it works

  1. List all .pdf files in the current folder.

  2. Get each file name and tokenize it.

  3. Ensure the retrieved characters are actually numbers:

    The variable is echoed and then piped to the findstr command, which will use a regular expression to match alphabetical characters.

    • ^ matches beginning of line;
    • \" matches a straight quote character (");
    • [0-9] defines a character class which matches any character from 0 to 9;
    • * repeats zero or more occurrences of the previous class;
    • $ matches end of line.

    Additionally, the regular expression will try to match as much valid dates as possible. The !errorlevel! variable will be set to 0 if there's a match, or 1 otherwise. The findstr output will be then redirected to nul, thus ignored.

  4. Create the target folder in case it doesn't exist already.

  5. Move the current file to the related folder.

Further reading

Некоторые файлы также могут быть названы: «BINNAWAY - WERRIS CK - 483.94 - 120612 (1)» или «BINNAWAY - WERRIS CK - 483.94 - 120612 (2)» или «BINNAWAY - WERRIS CK - 483.94 - Нет даты», но они отсутствуют » Их слишком много, поэтому я был бы рад просто перенести те, которые заканчиваются на дату, такие как «BINNAWAY - WERRIS CK - 483.94 - 120612». Кроме того, я открыл папку со всеми файлами PDF и запустил скрипт в командной строке (я полагаю, для этого и нужен скрипт), но ничего не произошло. Ваш сценарий предполагает, что мне нужно указать папку, содержащую все датированные папки где-нибудь? user309970 10 лет назад 0
@ user309970 Я улучшил скрипт для обработки файлов с именами, такими как `BINNAWAY - WERRIS CK - 483.94 - 120612 (1)`, и исправил ошибку, связанную с получением даты. Файлы без действительных номеров не будут перемещены. Возможно, я не достаточно ясно дал понять, но, будучи пакетным скриптом, он не предназначен для запуска как есть: вам нужно сохранить код в новом текстовом файле и убедиться, что [расширение] (http: // support). microsoft.com/kb/865219/en-us) это `.cmd`. Затем вы можете просто переместить пакетный скрипт в папку, содержащую файлы `.pdf`, и дважды щелкнуть по нему, чтобы выполнить его код. Успешно протестировано с Windows XP и 7. and31415 10 лет назад 0
0
user263743

Здравствуйте, я подумал, что буду сообщать о достигнутом прогрессе и давать отзывы на свои вопросы. Чтобы учесть файлы с форматом именования <name1> - <some numbers> - <date> вместо того, <name1> - <name2> - <some numbers> - <date>что предполагается @ and31415 в предоставленном им скрипте, я только что изменилtokens=4 наtokens=3в свежем .cmd файле. Это сработало. Но все же многие файлы не были обработаны этими пакетными сценариями. Я выяснил, что скрипт обрабатывает только некоторые файлы в папке (он обрабатывает только 50-100 PDF-файлов, и у меня есть тысячи PDF-файлов, чтобы пройти), поэтому я создал новую папку и выгрузил туда лишние PDF-файлы и запустил пакетные сценарии там. Многие PDF-файлы еще не обработаны, но я собираюсь обработать 50-100 PDF-файлов каждый в новой папке, и это должно быть сделано довольно быстро. Не идеально, но все же намного лучше, чем делать это вручную один за другим! Спасибо за вашу помощь @ and31415 :)

С тех пор я обновил свой оригинальный скрипт, чтобы он работал с любыми файлами, заканчивающимися на `- `. and31415 10 лет назад 0

Похожие вопросы