2014-09-08 4 views
0

Мне нужно переименовать целую файловую структуру и найти определенную часть строки, такую ​​как «_foo», и переименовать ее в «». Структура будет как: something_foo-> multiples_folders_and_files_foo-> multiples_folders_and_files_foo-> files_fooПереименовать все файлы и папки в папке и вложенной папке

Где все файлы в каждой папке и каждый папку в каждых папки не должны содержать часть Fo строки «_foo».

Я работаю под окнами. Я попробовал скрипт powershell, я смог переименовать одну папку, но не рекурсивно переименовать все папки.

спасибо, ребята!

+0

Это поможет, если вы показали нам, какой у вас код, и мы можем помочь сделать его лучше. Сейчас похоже, что вы хотите, чтобы мы создали для вас целое решение, для которого это не так. – Matt

+0

Да, я знаю, что это можно сделать в powershell всего за 2 строки, нам просто нужно посмотреть, что вы сделали, чтобы мы могли помочь исправить то, что вы не предоставили целого решения. – TheMadTechnician

ответ

0
@echo off 
setlocal 
set "string_to_remove=_foo" 
set "root_dir=c:\root" 

pushd "%root_dir%" 

setlocal enableDelayedExpansion 

    for %%f in (*) do (
     set "file_name=%%f" 
     ren "!file_name!" "!file_name:%string_to_remove%=!" 

    ) 


for /r /d %%# in (*) do ( 
    set "dir_name=%%#" 
    pushd "%%#" 
    for %%f in (*) do (
     set "file_name=%%f" 
     ren "!file_name!" "!file_name:%string_to_remove%=!" 

    ) 
    popd 
    if "!dir_name!" NEQ "!dir_name:%string_to_remove%=!" move "!dir_name!" "!dir_name:%string_to_remove%=!" 
) 
popd 
endlocal 
0

Не тестировался, но попробуйте это (в PowerShell)

PS> ls -rec -path $path | Ren -new { $_.name -replace '_foo' } -passthru 

Если работа удалить - passthru переключатель

Edit: Если '_foo' в конце имени вы можете изменить выражение, подобное:

| Ren -new { $_.basename -replace '_foo$' } -ea silentlycontinue 

Редактировать:

Для более надежного кода: (спасибо TheMadTechnician)

PS> GCI $path -filter '*_foo*' -rec | Ren -new { $_.name -replace '_foo' } -passthru 
+0

Это вернет много ошибок, если у него есть что-либо без _foo в имени. Вы должны были бы ввести '| Where {$ _. Name -match" _foo "} |' там. – TheMadTechnician

+0

Или установка «erroraction» с значением «silentcontinue» ... потому что «где» Cmdlet медленный –

+1

Тогда он пропустит, когда файлы/папки не могут быть переименованы из-за проблем с ReadOnly или File In Use. Если вы чувствуете, что где находится слишком медленно, то фильтруйте на уровне провайдера и выполняйте 'GCI $ Path -Recurse -Filter '* _foo *" | Ren' – TheMadTechnician

0
@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "remove=_foo" 

    for /f "delims=" %%a in ('dir /s /b "*%remove%*.*" 2^>nul ^| sort /r') do (
     set "name=%%~nxa" 
     setlocal enabledelayedexpansion 
     for %%b in ("!name:%remove%=!") do endlocal & echo ren "%%~fa" "%%~b" 
    ) 

Это перечислит все соответствующие файлы/папки, сортировать в обратном порядке (так файлы обрабатываются до папки, которая содержит их) и каждый из них удаляет указанную строку

Операции переименования отображаются только на консоли. Если выход правильный, удалите команду echo

Смежные вопросы