WinFuture-Forum.de: Gleiche Dateien Per Batch Finden Und Löschen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Gleiche Dateien Per Batch Finden Und Löschen


#1 Mitglied ist offline   Link 

  • Gruppe: aktive Mitglieder
  • Beiträge: 20
  • Beigetreten: 12. Dezember 05
  • Reputation: 0

geschrieben 27. März 2006 - 15:47

Also, folgendes Problem:
Es sind mehrere gleiche Dateien vorhanden, die sich nur im Namen (und Ordner wo sie drin sind) unterscheiden. Diese sollen gefunden werden (es sind ja auch noch andere Dateien da) und bis auf ein Exemplar in einem ausgewähltem Ordner gelöscht werden.

Die identifizierung funktioniert ja mit fc oder comp, nur dass diese dann auch gelöscht werden hab ich noch nicht hinbekommen. :unsure:
Das kann auch mit zusätzlichen Kommandozeilen-Tools erfolgen, wichtig ist nur, dass es sich per Batch straten lässt und dass man in der Batch über Parameter bestimmen kann, was gelöscht werden soll.
0

Anzeige



#2 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 27. März 2006 - 16:19

Also ich habe mir das selbst Abhilfe verschafft. Ein modifiziertes SHA1SUM ohne Filename-Tail, 'cat' und Alternate Data Streams.

@echo off
:again
if "%~1"=="-c" (
	for /r %%d in (*.*) do (
		cat <"%%~d":SHA1 >%TEMP%\tmp
		if exist %TEMP%\tmp (
			set sum1=0
			set sum1=1
			for /f "delims=" %%j in (%TEMP%\tmp) do set sum1=%%j
			sha1 "%%~d" >%TEMP%\tmp
			for /f "delims=" %%j in (%TEMP%\tmp) do set sum2=%%j
			del /f %TEMP%\tmp
			if NOT "%sum1%"=="%sum2%" echo BAD: "%%~d"
		) else (
			echo MISSING: "%%~d"
		)
	)
)
if "%1"=="-a" (
	for /r %%d in (*.*) do (
		cat <"%%~d":SHA1 >%TEMP%\tmp
		if exist %TEMP%\tmp (
			del /f %TEMP%\tmp
		) else (
			sha1 "%%~d">"%%~d":SHA1
		)
	)
)
if "%~1"=="-u" (
	for /r %%d in (*.*) do (
		cat <"%%~d":SHA1 >%TEMP%\tmp
		if exist %TEMP%\tmp (
			del /f %TEMP%\tmp
			sha1 "%%~d">"%%~d":SHA1
		)		
	)
)
if "%~1"=="-r" (
	for /r %%d in (*.*) do (
		cat <"D:\home\All Users\bin\scripts\empty" >"%%~d":SHA1
	)
)
if "%~1"=="-d" (
	for /r %%d in (*.*) do (
		cat <"%%~d":SHA1 >%TEMP%\tmp
		if exist %TEMP%\tmp (
			for /f "delims=" %%i in (%TEMP%\tmp) do (
				if exist %TEMP%\%%i.sha1 (
					echo del /f "%%~d" >>%TEMP%\del.cmd
				) else (
					echo.>%TEMP%\%%i.sha1
				)
			)
			rem del /f %TEMP%\tmp
		)
	)
	if exist %TEMP%\del.cmd (
		call %TEMP%\del.cmd
		del /f %TEMP%\del.cmd
	)
	del /f %TEMP%\*.sha1
)
if "%~1"=="-e" (
	for /r %%d in (*.*) do (
		cat <"%%~d":SHA1 >%TEMP%\tmp
		if exist %TEMP%\tmp (
			for /f "delims=" %%i in (%TEMP%\tmp) do echo %%i  "%%~d">>%TEMP%\sha1sum.txt
			del /f %TEMP%\tmp
		)
	)
	if exist %TEMP%\sha1sum.txt move %TEMP%\sha1sum.txt .
)
shift
if NOT "%1"=="" goto :again
@echo off


a - add
r - remove
u - update
c - check
e - export
d - duplicate removal

Wie du siehst werden sämtliche Löschaufträge in eine neue Batch geschrieben, die normalerweise automatisch ausgeführt wird. Kann man aber auch noch vorher manuell begutachten.

Was fehlt ist eine Übersicht, zu welcher Datei eine Datei jeweils ein Duplikat ist und welches der Duplikate man löschen möchte. Der Einfachheit halber wird einfach alles direkt durchsucht und nur das Auftreten eines Duplikats vermerkt.

Der Vorteil bei den Prüfsumme ist, daß du dir unnötige Vergleiche ersparst.

Dieser Beitrag wurde von Rika bearbeitet: 27. März 2006 - 16:20

Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#3 Mitglied ist offline   Link 

  • Gruppe: aktive Mitglieder
  • Beiträge: 20
  • Beigetreten: 12. Dezember 05
  • Reputation: 0

geschrieben 28. März 2006 - 15:03

<_<

Ich glaube, ich brauch da etwas Hilfe...

Ich bekomme immer die folgende Fehlermeldung:
rem del /f C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\tmp
)
)
Das System kann den angegebenen Pfad nicht finden.


Ich habe mir für das Ganze SHA1 von hier heruntergeladen. Ist es das richtige, oder brauch ich da ein spezielles?

Also die Batch findet alle Dateien und führt sich für alle auch aus nur kann es eben da was nicht finden...


EDIT: Problem gelöst, die Idee mit Prüfsummen hab ich einfach so eingebaut, dass ich genau bestimmen kann, welche Dateien gelöscht weden :) .

Dieser Beitrag wurde von Link bearbeitet: 30. März 2006 - 09:41

0

#4 Mitglied ist offline   Link 

  • Gruppe: aktive Mitglieder
  • Beiträge: 20
  • Beigetreten: 12. Dezember 05
  • Reputation: 0

geschrieben 31. März 2006 - 11:32

Hab noch ne kleine Frage, will jetzt dafür nicht einen extra Thread aufmachen.

Was ist an dieser Zeile falsch?
if exist *.* (ren *.* %1-09.*) else goto ende

Wenn die Datei vorhanden ist, funktioniert es, wenn nicht -> Syntaxfehler. Hab auch schon andersrum probiert, da funktioniert eindeutig der GOTO-Befehl nicht zusammen mit der IF-Bedingung, auch mit Klammern drum nicht, aber wieso?

Wenn ich das gleiche GOTO einfach so an den Anfang der Batch schreibe, funktioniert der. ;(
0

#5 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 31. März 2006 - 13:55

Zitat

Ich bekomme immer die folgende Fehlermeldung

Jupp, ersetze mal alle %TEMP% durch "%TEMP%~1". Es ist aber problematisch, weil die Datei-Expansion nicht immer ordentlich funktioniert. Besser ist es, nur Pfade zu verwenden, die keine Leerzeichen enthalten.

Zitat

Ich habe mir für das Ganze SHA1 von hier heruntergeladen. Ist es das richtige, oder brauch ich da ein spezielles?

Wie schon benannt: modifiziert. SHA1SUM spuckt normalerweise SHA1-Hash, zwei Leerzeichen und den kompletten Dateinamen inklusive Pfad aus. Durch schnelles Rumfummeln im Quelltext und Neukompilieren spruckt es nur noch den Hash aus.

Klar, man kann es auch mit den Mitteln einer Batch entsprechend nachbearbeiten, aber das ist unnötig aufwendig, fehleranfällig und ineffizient.

Zitat

if exist *.* (ren *.* %1-09.*) else goto ende

*.* ist keine Datei, sondern bestenfalls ein Satz von Dateien. Außerdem muss der else-Bereich ebenfalls geklammert werden.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#6 Mitglied ist offline   Link 

  • Gruppe: aktive Mitglieder
  • Beiträge: 20
  • Beigetreten: 12. Dezember 05
  • Reputation: 0

geschrieben 31. März 2006 - 14:29

Das Problem mit der Fehlermeldung ist, wie in meinem Edit geschrieben, erledigt, ich hab das mit den Prüfsummen auf eine etwas andere Art eingebaut. An dem "schnellem Rumfummeln im Quelltext und Neukompilieren" wäre ich sowieso gescheitert. :D

 Zitat (Rika: 31.03.2006, 14:55)

*.* ist keine Datei, sondern bestenfalls ein Satz von Dateien. Außerdem muss der else-Bereich ebenfalls geklammert werden.

Heißt das, es funktioniert so nicht? Ich will einfach dass er falls überhaupt eine Datei vorhanden ich, diese umbenennt und falls keine Datei vorhanden ist, soll er zum Ende gehen.

EDIT: mit Klammern funktioniert es auch nicht ;( .

Dieser Beitrag wurde von Link bearbeitet: 31. März 2006 - 14:31

0

#7 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 31. März 2006 - 15:08

set foo=bar
for /r %%i in (*.*) do set foo=blah
if NOT "%foo%"=="bar" (...)

Wenn du den kompletten Teil hinter dem IF-Zweig mit in die Klammern nimmst, dann kannst du dir auch noch das GOTO ersparen.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#8 Mitglied ist offline   Link 

  • Gruppe: aktive Mitglieder
  • Beiträge: 20
  • Beigetreten: 12. Dezember 05
  • Reputation: 0

geschrieben 31. März 2006 - 16:15

Es funktioniert. Danke. ;)
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0