2017-02-19 32 views
1

Сегодня я совершил серьезную ошибку при обработке моей самоходной системы резервного копирования и удалил примерно половину моей пользовательской папки. К счастью, резервная копия существовала и смогла скопировать все мои данные. Плохая часть - каждый восстановленный файл имеет отметку времени в имени файла.Пакет или Bash для удаления отметки времени в тысячах файлов

Так файл, который был filename.file теперь имя файла ~ 20170401-1999.file

Я не слишком ярким, когда речь идет о пакетных файлов или что нет, но есть ли способ, может быть BAT запрограммировано для запуска через каждое имя файла и вынести временную метку? Каждая временная метка начинается с ~ и заканчивается периодом типа файла. Таким образом, устраняя все, включая и после тильды, и останавливаясь на персонаже до этого периода, проблема будет устранена.

Есть около 4600 файлов, требующих исправления с широким спектром расширений файлов. Я нахожусь в Windows 10 Pro и могу использовать powershell или bash для исправления ошибки. У меня установлена ​​подсистема Linux Linux, поэтому также возможен сценарий bash.

+0

В каждом имени файла всегда имеется ровно один символ '~'? – aschipfl

+0

У вас уже есть ответ, но да, он появился ровно один раз в каждом файле, который был восстановлен из резервной копии. Невосстановленные файлы были просто filename.type, в то время как файлы восстановления были filename ~ dategroup-timegroup.type (I.E. resume ~ 20170409-173314.pdf –

+0

Не могли бы легко сделать это с помощью любой свободно доступной утилиты переименования файлов в Интернете. – Squashman

ответ

1

PowerShell предлагает простое решение:

Get-ChildItem -Recurse -File -Filter *~* | 
    Rename-Item -NewName { $_.Name -replace '~[^.]+' } -WhatIf 
  • -WhatIfпредварительные просмотры Операции переименования; удалите его, как только вы подтвердите, что команда будет работать по назначению.

  • Для простоты я сделал предположение, что любое имя файла, содержащее ~, должно быть переименовано; согласование может быть уточнена, если ложные срабатывания должны быть устранены:
    Get-ChildItem -Recurse -File *~[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9].*

  • Matching ограничивается файлов (-File), расположенных в любой точке поддерева текущего каталога в (-Recurse).
    В соответствующих файлах, расположенных только в текущем каталоге, удалите -Recurse.

  • Блок скрипта ({ ... }) передается в -NewName параметр Rename-Item командлета, вычисляет новое имя файл:

    • $_.Name возвращает имя входного файла ($_ является автоматическим переменной PowerShell для представляющей объект ввода под руку).
    • -replace '~[^.]+' выполняет регулярное выражение на основе замены строк: '~[^.]+' совпадающих с последующим ~ любой последовательностью непустой (+), отличных от . ([^.]) символов .; не указывая заменяющую строку, неявно использует пустую строку, так что соответствующая часть эффективно удаляется из имени.
0

Только некоторые идеи с верхней части головы.

Вы можете перебирать файлы, и для каждого файла, вы можете заменить подстроку, которые совпадают с регулярным выражением /~\d+-\d+/ с "" (то есть пустой строкой) и использовать модифицированную строку в качестве нового имени файла.

0
@ECHO OFF 
SETLOCAL 

SET "sourcedir=U:\sourcedir" 
FOR /f "delims=" %%a IN (
'dir /b /s /a-d "%sourcedir%\*" ' 
) DO (
FOR /f "tokens=1,2delims=~" %%p IN ("%%~na") DO (
    IF "%%q" neq "" ECHO(REN "%%a" "%%~p%%~xa" 
) 
) 

GOTO :EOF 

Вы должны были бы изменить установку sourcedir в соответствии с вашими обстоятельствами.

Необходимые команды REN - это всего лишь ECHO ed для целей тестирования. После того, как вы подтвердили правильность команд, измените ECHO(REN на REN, чтобы фактически переименовать файлы.

Выполните сканирование каталогов с подкаталогами в базовой форме с именами director и назначьте %%a. Затем обозначьте имя части полного имени, которое находится в %%p и %%q, используя ~ в качестве разделителя. Если второй маркер не является пустым, то есть отметка времени в %%q так сформировать новое имя файла из части в %%p и расширение с %%a

0

изменения mklement0 без регулярных выражений

Get-ChildItem -Recurse -File -Filter *~*.file | 
    rename-item -NewName {"{0}{1}" -f ($_.BaseName -split "~")[0], $_.Extension } -WhatIf 

короткая версия:

gci -Rec -File -Filter *~*.file | ren -n {"{0}{1}" -f ($_.Base -split "~")[0], $_.Extension } -WhatIf