Заменить последний _ при переименовании файлов - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу удалить все 「name.jpg」 и переименовать 「name_.jpg」 в 「name.jpg」 в Windows.Структура файла выглядит следующим образом.

>upperFolder
  >p1
    >學生_二反田●雄.jpg
    >學生_二反田●雄_.jpg
    >學生_半田●男.jpg
    >學生_半田●男_.jpg
    >學生_潘●.jpg
    >學生_潘●_.jpg
    >...
  >...
  >p7
    >學生_石井節●.jpg
    >學生_石井節●_.jpg
    >學生_王裕●.jpg
    >學生_王裕●_.jpg
    >學生_●垣  勇.jpg
    >學生_●垣  勇_.jpg

удалить p1 / 學生 _ 二 反 田 ● 雄 .jpg

переименовать p1 / 學生 _ 二 反 田 ● 雄 _.jpg p1_ 學生 -田 反 田 ● 雄 .jpg

Окончательный результат выглядит следующим образом.p1_ должен предотвратить повторение имени файла и - отдельное имя студента.

>upperFolder
  >p1_學生-二反田●雄.jpg
  >p1_學生-半田●男.jpg
  >p1_學生-潘●.jpg
  >...
  >p7_學生-石井節●.jpg
  >p7_學生-王裕●.jpg
  >p7_學生-●垣  勇.jpg

Как я могу сделать это в bat или php?

Я пытался

mkdir tmp

for /f "eol=: delims=" %%D in ('dir /b /s /ad *^|sort /r') do (
  pushd "%%D"
  for %%F in (*) do move "%%F" "..\%%~nxD_%%F" >nul
  popd
)

move *_.jpg tmp
del *.jpg
cd tmp 
move *.jpg .. 2>NUL

, ноне могу избавиться от последнего '_'

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

В CMD нет подстановочных знаков, которые не соответствуют символу, поэтому вместо этого вы можете временно изменить расширение файлов, имена которых заканчиваются на _:

Примечание : не забудьте запуститьследующие фрагменты из upperFolder и изменить% g для %% g, если вы работаете из командного файла.

:: /r stands for recursive and ~n stands for (file)name
for /r %g in (*_.jpg) do ren %g "%~ng.jphg"

Затем вы можете удалить файлы, имена которых не заканчиваются на _:

del /s *.jpg

И, наконец, переименуйте и переместите файлы, имена которых заканчиваются на _.Но вы просите что-то хитрое, то есть перед именем файла добавьте имя каталога, содержащего его, замените внутренний _ имени файла на -, удалите завершающий _ имени файла, а затем переместите файл в upperFolder:

:: so that the variable expansion inside for's works as expected
setlocal EnableDelayedExpansion
:: loop through all the directories and store the names in g
for /d %g in (*) do (
    for %h in ("%g\*_.jphg") do (
        set "newname=%~nh"
        :: remove trailing _
        set "newname=!newname:~0,-1!"
        :: replace ALL _ with -, assuming the filename only has one inner _
        set "newname=!newname:_=-!"
        :: prepend directory name and restore extension
        set "newname=%g_!newname!.jpg"
        :: rename and move to current directory
        move %h ".\!newname!"
    )
)
0 голосов
/ 21 ноября 2018

Что-то вроде этого должно работать для вас:

for %%a in (*.jpg) do del /y "%%~a" & ren "%%~na_%%~nx" "%%~nxa"

Здесь мы:

  • ищем все файлы типа jpg
    • удаляем найденные
    • , а затем переименуйте файлы с тем же именем, заканчивающимся _, в имена исходных файлов

См. Команду for /? или this для получения дополнительной информации о %%~na и подобных.

Обратите внимание, что если ваша системная OEM кодовая страница не поддерживает кандзи, это не будет работать.Вы можете обойти эту проблему, переключившись на кодировку UTF-8, введя команду CHCP 65001 и сохранив командный файл как UTF-8 (no BOM).Для получения дополнительной информации см. this

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...