Verzeichnisse finden ohne bestimmte Datei
Moderators: Hacker, Stefan2, white
Verzeichnisse finden ohne bestimmte Datei
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
z.B. alle verzeichnisse ohne mp3's
Tia
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
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
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)
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)
2morte01

Also beim Directory-Plugin wird da nichts durchsuchtdas 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)

2morte01
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?
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.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?
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?
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
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
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
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
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
* 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
Hallo,
ich hatte kürzlich dasselbe Problem. Mit AutoHotkey (http://www.autohotkey.com) gibt es eine einfache Lösung:
"dir" und "ext" muss entsprechend angepasst werden.
Das Ergebnis wird im Ausführungsverzeichnis des Scripts in eine Datei geschrieben.
Viele Grüße
Siggi
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
Das Ergebnis wird im Ausführungsverzeichnis des Scripts in eine Datei geschrieben.
Viele Grüße
Siggi
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:
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