Dosyaları alt dizinlerinde tutarken birden fazla klasörü nasıl yeniden adlandırabilirim?


0

Birden fazla klasörü yeniden adlandırmak ve tüm dosyaları ve alt dizinleri dokunsal tutmak istiyorum.
Windows toplu komutları gibi xcopy ve move her olayı idare edemiyorum * .

Eski yollar ve yeni yollar ile iki sütun ayarladım.

OLD PATH            NEW PATH
C:\dir1\dir3\dir7   C:\a1\a2\a3      
C:\dir1\dir4\dir8   C:\b1\b2\b3      
C:\dir2\dir5\dir9   C:\c1\c2\c3      
...
C:\dir2\dir6\dir0   C:\d1\d2\d3      

Zorluklar: Satır başına birden fazla klasörün yeniden adlandırılması gerekiyor; gibi son listelenen klasörler dir7 birden fazla alt dizine sahip olabilir; dosya zaman damgaları değiştirilmemelidir


* xcopy hareket edemez, sadece kopyalar. Büyük verileri kopyalamak ve silmek için yeterli alanınız yoksa, bu bir problemdir.
move komut alt dizinleri taşımaz, sadece dosyalar


Bu gerçek bir soru muydu? Bir dakika içinde kendi cevabını buldun mu? Yoksa kişisel "nasıl yapılır" mı?
Rik


Tamam. Benim hatam. Bunu bilmiyordum.
Rik

Yanıtlar:


1

En basit (basit) toplu iş dosyası sürümü şöyle olurdu:

call :robo "C:\dir1\dir3\dir7"   "C:\a1\a2\a3"
call :robo "C:\dir1\dir4\dir8"   "C:\b1\b2\b3"
call :robo "C:\dir2\dir5\dir9"   "C:\c1\c2\c3"
echo etc...
call :robo "C:\dir2\dir6\dir0"   "C:\d1\d2\d3"
goto:eof

:robo
robocopy %1 %2 /MOVE /E
goto:eof

Boşlukları olması durumunda dizinleri alıntılamanız gerekir.

Dizinleri bir dosyadan okumak için şunu yapmalısınız:

directories.txt:

C:\dir1\dir3\dir7,C:\a1\a2\a3
C:\dir1\dir4\dir8,C:\b1\b2\b3
C:\dir2\dir5\dir9,C:\c1\c2\c3
C:\dir2\dir6\dir0,C:\d1\d2\d3

Tırnaklara gerek yok ve virgül ile ayırın. Sonra toplu iş dosyasında:

FOR /F "tokens=1-2* delims=," %%A IN (directories.txt) DO (
  robocopy "%%A" "%%B" /MOVE /E
)

Ayrıca burada ... ilk robokopinin ne yaptığını görmek istiyorsanız /L.

Buna benzer bir dosyanız varsa (birinci ve ikinci sütunu hizalamak için boşluk içeren), dizinlerden öncü ve sondaki boşlukları çıkarmak için bazı kodlar eklemeniz gerekir:

Tekrar directories.txt:

C:\dir1\dir3\dir7\sada\asda ,  C:\a1\a2\a3
C:\dir1\dir4\dir8           ,  C:\b1\b2\b3
C:\dir2\dir5\dir9           ,  C:\c1\c2\c3
...
C:\dir2\dir6\dir0           , C:\d1\d2\d3

Ve bu toplu iş dosyası olarak:

@echo off
setlocal enabledelayedexpansion
FOR /F "tokens=1-2* delims=," %%A IN (directories.txt) DO (
  call :trim dir1 %%A
  call :trim dir2 %%B
  robocopy "!dir1!" "!dir2!" /MOVE /E
)
goto:eof

:trim
set trimmed=%2
for /f "tokens=* delims= " %%c in ("%trimmed%") do set trimmed=%%c
for /l %%c in (1,1,100) do if "!trimmed:~-1!"==" " set trimmed=!trimmed:~0,-1!
set "%~1=%trimmed%"
goto:eof

Not: Dizinlerin gerçekten var olup olmadığını veya yalnızca bir sütunun dolu olup olmadığını görmek için hata denetimi yapılmaz ... vb ...
(ama elbette eklenebilir).


İkinci yaklaşımı beğendim, bunu deneyeceğim
nixda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.