Verzeichnisse finden ohne bestimmte Datei

German support forum

Moderators: Hacker, Stefan2, white

Post Reply
morte01
Junior Member
Junior Member
Posts: 25
Joined: 2004-02-08, 09:13 UTC

Verzeichnisse finden ohne bestimmte Datei

Post by *morte01 »

Gibt es eine Möglichkeit alle Verzeichnisse zu finden die bestimmte Datei nicht enthalten (auch nicht in Unterverzichnissen?
z.B. alle verzeichnisse ohne mp3's

Tia
icfu
Power Member
Power Member
Posts: 6052
Joined: 2003-09-10, 18:33 UTC

Post by *icfu »

Dafür müßten die Verzeichnisse selbst die Information in sich tragen, ob sich in ihnen ein MP3 befindet. Du müßtest sie also vor der Suche entsprechend markieren, z.B. per NTFS-Kommentar o.ä., dann könntest Du sie auch problemlos filtern.

Ansonsten geht's nur per Workaround. Du kannst beispielsweise nach *.* | *.mp3 suchen, Verzeichnisse bei der Suche ausschließen!
Anschließend anwenden und dann alle gefundenen Dateien markieren und per TreeCopyPlus-Plugin packen.

Im gegenüberliegenden Panel wird dann die Verzeichnisstruktur nachgebildet, die keine MP3-Dateien enthält.

Nachteil der ganzen Sache:
Da Du nach Dateien suchst, werden leere Verzeichnisse nicht gelistet.

Icfu
This account is for sale
morte01
Junior Member
Junior Member
Posts: 25
Joined: 2004-02-08, 09:13 UTC

Post by *morte01 »

edit:
funzt leider doch nicht... sobald ein verzeichnis sowohl gewünschte als auch ungewünschte dateierweiterungen enthält taucht das verzeichnis auch auf.

Trotzdem herzlichen Dank! :)

das mit den leeren Verzeichnissen is kein Problem, die bekommt man ja mit dem DirSizeCalc-Plugin raus und kann sie löschen.
Plugin-Erweiterungswunsch wurde schon an Autor vom Directory-Plugin geschickt. (die Verzeichnisse werden ja sowieso durchsucht, also sollte es auch möglich sein zu erkennen ob eine best. erweiterung im verzeichnis vorhanden ist)
User avatar
Lefteous
Power Member
Power Member
Posts: 9537
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

2morte01
das mit den leeren Verzeichnissen is kein Problem, die bekommt man ja mit dem DirSizeCalc-Plugin raus und kann sie löschen.
Plugin-Erweiterungswunsch wurde schon an Autor vom Directory-Plugin geschickt. (die Verzeichnisse werden ja sowieso durchsucht, also sollte es auch möglich sein zu erkennen ob eine best. erweiterung im verzeichnis vorhanden ist)
Also beim Directory-Plugin wird da nichts durchsucht :-)
icfu
Power Member
Power Member
Posts: 6052
Joined: 2003-09-10, 18:33 UTC

Post by *icfu »

funzt leider doch nicht... sobald ein verzeichnis sowohl gewünschte als auch ungewünschte dateierweiterungen enthält taucht das verzeichnis auch auf.
Oops, jo, das war ein kleiner aber feiner Denkfehler. ;)

Icfu
This account is for sale
morte01
Junior Member
Junior Member
Posts: 25
Joined: 2004-02-08, 09:13 UTC

Post by *morte01 »

@Lefteous:

Schade! Jetzt muss ich mir wohl selbst mal anschauen wie ich so ein Plugin hinbekommme. Gibts ne Möglichkeit mit c# ein Plugin zu schreiben?
User avatar
Lefteous
Power Member
Power Member
Posts: 9537
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

2morte01
Schade! Jetzt muss ich mir wohl selbst mal anschauen wie ich so ein Plugin hinbekommme. Gibts ne Möglichkeit mit c# ein Plugin zu schreiben?
Ich meinte ja nur, das der Directory-Plugin nichts sucht. Vielmehr werden jeweils Zeichenketten zurückgegeben, die der Total Commander, dann mit dem Suchstring vergleicht.
Allein von den Programmquellen her würde es eher zu DirSizeCalc passen, inhaltlich aber nicht.

Abgesehen davon habe ich leider mit neuen Versionen meiner Plugins genug zu tun - tut mir leid! Ich kann Dir aber gerne helfen da selbst was auf die Beine zu stellen. Ich kann Dir vorschlagen ein kleines Beispielplgin, dass schon in die richtige Richtung geht zu schicken. Fertigentwicklen musst Du es dann aber selbst.

Plugins auf Basis von C# halte ich derzeit für keine grandiose Idee. Viele Leute möchten die dazugehörige Runtime nicht installieren. Vielleicht ändert sich das in Zukunft, wenn jeder ein Betriebssystem hat, auf dem das schon vorinstalliert ist. Hast Du denn auch die C++ Komponente vom Visual Studio installiert?
morte01
Junior Member
Junior Member
Posts: 25
Joined: 2004-02-08, 09:13 UTC

Post by *morte01 »

installiert hab ich die c++-gschicht schon, jedoch bin ich leider nicht so der c++-checker. Falls du mir aber das beispielplugin zukommen lassen würdest, könnt ichs ja trotzdem mal probieren.

Tia

mail: ******
User avatar
Lefteous
Power Member
Power Member
Posts: 9537
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

2morte01
OK ich schick Dir spätestens morgen mal was.

Die Mail Adresse habe ich notiert und gelöscht (SPAM-Schutz).
morte01
Junior Member
Junior Member
Posts: 25
Joined: 2004-02-08, 09:13 UTC

Post by *morte01 »

super, herzlichsten dank!
icfu
Power Member
Power Member
Posts: 6052
Joined: 2003-09-10, 18:33 UTC

Post by *icfu »

Gib die Emailadresse einfach in Deinem Profil an, dann hast Du einen Emailbutton unter Deinen Beiträgen, den man zur Kontaktaufnahme per Webformular nutzen kann. Öffentlich wird die Adresse dadurch nicht gemacht.

Icfu
This account is for sale
User avatar
van Dusen
Power Member
Power Member
Posts: 684
Joined: 2004-09-16, 19:30 UTC
Location: Sinzig (Rhein), Germany

Post by *van Dusen »

Noch eine (etwas holprige) Umgehungslösung zum ursprünglichen Problem:

Eine Kombination aus
* einem DOS-Batch, der
* ein Kommando aus den GnuWin32 CoreUtils verwendet,
* einem Button im TC für den Aufruf des Batchs,
* dem Inhaltsplugin <global_diz> und
* einer benutzerdefinierten Spalte:

CountExt.bat

Code: Select all

@Echo OFF

Rem CountExt - V1.0 vom 25.Mai 2005
Rem
Rem Syntax:
Rem    CountExt {Dateinamenserweiterung}
Rem Beschreibung:
Rem    Ermittelt die Anzahl Dateien *eines* bestimmten Dateityps (Parameter {Dateinamenserweiterung})
Rem    für jedes Verzeichnis im Startverzeichnis. Die Verzeichnisse werden rekursiv durchsucht.
Rem    Erzeugt eine vom Inhaltsplugin 'Global_DIZ' lesbare Ergebnisdatei 'CountExt.diz'
Rem Voraussetzungen und Anwendung:
Rem    * Benötigt 'Paste.exe' aus den GnuWin32 CoreUtils
Rem    * Anwendung i.V.m. dem TotalCommander-Inhaltsplugin 'Global_DIZ'
Rem      In der 'global_diz.ini' im Abschnitt [UserColumns] Zeile 'Column2=CountExt.diz' eintragen und
Rem      'CountExt' einer Ansicht als benutzerdefinierte Spalte hinzufügen
Rem    * Einbindung in TotalCommander per Button; Button-Einstellungen:
Rem      Kommando : [{Laufwerk:\}][{Pfad\}]CountExt.bat
Rem      Parameter: ?ext
Rem      Startpfad: (leer)
Rem    * Im Startverzeichnis wird die Datei 'CountExtDummy.tmp' angelegt (und sogleich wieder gelöscht),
Rem      um die Aktualisierung der Dateiliste zu erzwingen
Rem      (setzt Schreibrechte im Startverzeichnis und aktiviertes 'WatchDirs' (in INI zu TC 6.52 oder höher) voraus)

If EXIST %TEMP%\CountExtDir.lst Del %TEMP%\CountExtDir.lst
If EXIST %TEMP%\CountExtExt.lst Del %TEMP%\CountExtExt.lst
For /D %%D IN (*) DO @Echo %%~fsD>>%TEMP%\CountExtDir.lst
For /D %%D IN (*) DO Dir /B /S "%%D" | Find /C /I ".%1" >>%TEMP%\CountExtExt.lst
C:\Programme\GnuWin32\bin\Paste.exe -d = %TEMP%\CountExtDir.lst %TEMP%\CountExtExt.lst >C:\Programme\TotalCmd\PlugIns\GlobalDIZ\CountExt.diz
Echo.>CountExtDummy.tmp
Del CountExtDummy.tmp
Bestimmt geht's eleganter. Der Batch "ignoriert" in obiger Version leider bestimmte Verzeichnisse (alle versteckten, Verzeichnisse mit bestimmten Sonderzeichen, z.B. wird ein Verzeichnis namens <M+R> nicht ausgewertet). Auch der Versuch, den Refresh durch Schreiben (und Löschen) einer Dummydatei zu erzwingen, misslingt manchmal.

Die flexiblere Variante,
* dem Batch ein Dateimuster (statt nur einer Extension) als Argument zu übergeben,
* nach passenden Dateien per "Dir"-Kommando rekursiv suchen zu lassen
* und schließlich in der Ausgabe von "Dir" mit "For" und "Find" für jedes Verzeichnis im Startverzeichnis die Anzahl der Zeilen zählen zu lassen, in denen der jeweilige Verzeichnisname vorkommt
habe ich leider nicht hinbekommen... Dafür hätte ich Kommandos benötigt, mit denen man Ausgaben in den Standard-Output editieren kann (um z.B. Zeilenumbrüche zu entfernen, beliebige Strings anzuhängen, Strings zu ersetzen). Mit Windows-Bordmitteln (und selbst den CoreUtils) ist in dieser Hinsicht aber nicht viel zu machen, oder?


[EDIT] 26.05.05 14:05:
Hier eine bessere Version:

CountPat.bat

Code: Select all

@Echo OFF

If EXIST %TEMP%\CountPatDir.lst Del %TEMP%\CountPatDir.lst
If EXIST %TEMP%\CountPatQty.lst Del %TEMP%\CountPatQty.lst

For /F "delims=?" %%D IN ('Dir /AD /B /S') DO Echo %%~fsD>>%TEMP%\CountPatDir.lst
For /F "delims=?" %%D IN ('Dir /AD /B /S') DO Dir /A /B /S "%*" | Find /C /I "%%D\" >>%TEMP%\CountPatQty.lst
C:\Programme\GnuWin32\bin\Paste.exe -d = %TEMP%\CountPatDir.lst %TEMP%\CountPatQty.lst >C:\Programme\TotalCmd\PlugIns\GlobalDIZ\CountPat.diz

Echo.>CountPatDummy.tmp
Del CountPatDummy.tmp
Was daran besser ist?

* Dem Batch kann ein Dateimuster übergeben werden (z.B. (??) A*.mp3)
* Die ins Muster passenden Dateien werden auch gleich für alle Unterverzeichnisse gezählt, so dass man den Batch bei einem Wechsel in ein Unterverzeichnis nicht erneut aufzurufen braucht.
* Versteckte Verzeichnisse werden mitberücksichtigt

<CountPat.bat> verwendet einen anderen Namen für die Global_DIZ-Datei, nämlich <CountPat.diz>. Muss man in der <global_diz.ini> entsprechend berücksichtigen.

Nach wie vor ungelöst ist das Problem mit bestimmten Verzeichnisnamen.

Beispiel:

Ein Verzeichnis namens <M+R> hat den DOS-Namen <M_R~1>. Das Kommando Echo %%~fsD macht daraus <M_R~1+R>.
Aus dem Unterverzeichnis <M+R\Berliner Elektroniknacht 1987> wird <M_R~1\Berliner Elektroniknacht 198787>. Die letzte Pfadkomponente ist also gar nicht in den DOS-Namen <BERLIN~1> umgesetzt worden und es sind wieder die beiden letzten Zeichen des Langnamens angefügt worden.

Könnte das ein Bug bei der Ersetzung der Batchparameter sein? Oder hat das Pluszeichen eine Bedeutung, die ich noch nicht kenne?

[/EDIT]

Grüße, van Dusen
SiBu
Junior Member
Junior Member
Posts: 13
Joined: 2005-01-14, 22:37 UTC

Post by *SiBu »

Hallo,
ich hatte kürzlich dasselbe Problem. Mit AutoHotkey (http://www.autohotkey.com) gibt es eine einfache Lösung:

Code: Select all

dir=c:\Programme\totalcmd\
ext=dll

Loop, %dir%*.* , 2, 1
{
	IfNotExist, %A_LoopFileDir%\%A_LoopFileName%\*.%ext%
	{
	if a_index=1
	subdirswithout=%A_LoopFileDir%\%A_LoopFileName%\
	else
	subdirswithout=%subdirswithout%`n%A_LoopFileDir%\%A_LoopFileName%\
	}
}

FileAppend, %subdirswithout%, Verzeichnisse ohne %ext%.txt
"dir" und "ext" muss entsprechend angepasst werden.
Das Ergebnis wird im Ausführungsverzeichnis des Scripts in eine Datei geschrieben.

Viele Grüße
Siggi
morte01
Junior Member
Junior Member
Posts: 25
Joined: 2004-02-08, 09:13 UTC

Post by *morte01 »

Hi,

Nach langer Zeit hab ich wieder das Problem, dass ich Verzeichnisse ohne bestimmte Dateien suchen muss.

Ich hab mir das ahk-script von SiBu angeschaut, nur leider reicht das für meine Zwecke nicht aus:

Es prüft nur ob sich im aktuellen Verzeichnis keine Dateien befinden mit der gewünschten Erweiterung.
Ich hab mich also rangesetzt und versucht das Script umzuschreiben. Leider funzt da irgendwas nicht. Vielleicht kann mir jemand auf die Sprünge helfen.

Tia morte

So, hier nun das script:

Code: Select all

CheckFolderForExt(dir)
{
  
  extNotExist:= true
  IfExist, %dir%\*.%extension%
  {
    extNotExist := 0
  }

  Loop, %dir%\*.*, 2, 0 ; Verzeichnisse im aktuellen Verzeichnisfinden und loop ausführen, KEINE REKUSION
  {
    tempfolder := A_LoopFileFullPath
    tempBool1 := CheckFolderForExt(tempfolder) ; Ergebnis von CheckFolderForExt speichern
    if extNotExist  ; dies ist nur eine zwischenzeitliche Lösung: beim Debugging bin ich darauf gestossen dass AND bei mir ned richtig funktioniert.
    {
      if tempBool1
      {
        extNotExist := 1
      }
      else
      {
        extNotExist :=0
      }
    }
    else
    {
      extNotExist :=0
    }
    listvars
    pause
  }
;   
  if extNotExist
  {
    FileAppend , %dir%`n, Verzeichnis ohne %extension%.txt 
  }
  listvars
  pause
  return %extNotExist% ; hier sollte eigentlich das ergebnis in die rekursion zurück gegeben werden, aber ich bekomme kein ergebnis zurück
}


if 0 < 2  ; The left side of a non-expression if-statement is always the name of a variable.
{
    listvars
pause
    MsgBox This script requires at least 2 incoming parameters but it only received %0%.
    ExitApp
}
  
folder = %1% 
extension = %2%
testinger := CheckFolderForExt(folder)
listvars
pause
Post Reply