DIR-Dateinamen, die Erweiterungen enthalten

5

Ich habe nur versucht, ein Dump-Verzeichnis nach ZIP-Programmen wie PeaZip, NanoZip usw. zu durchsuchen, und bin auf ein seltsames Problem gestoßen, das ich nur ein paar Mal zuvor gesehen habe.

Ich benutzen den folgenden Befehl zur Liste Dateien , deren Dateinamen enthalten zip(zB nanozip.zip, peazip2.rar, winzip-beta.exeusw.):

dir *zip*

Hier werden alle Dateien aufgelistet, deren Dateinamen enthalten sind zip, aber auch alle Dateien mit einer .zipErweiterung (z foobar.zip. B. ).

Ich habe dann folgendes probiert:

dir *zip*.*

Dies ergab die gleichen Ergebnisse.

Kennt jemand einen Weg, um die erwarteten Ergebnisse zu erzielen? (Ich weiß, dass das for vielleicht möglich ist, aber die Ausgabe ist nicht korrekt.)

Synetech
quelle
Sie sagten, Sie suchen nach Programmen mit zipdem Namen. Wenn dies der Fall ist und ich Ihr Ziel nicht missverstanden habe, warum reicht es dann nicht aus, das Offensichtliche zu tun und .exeIhrem Muster lediglich die Erweiterung hinzuzufügen , z dir *zip*.exe.
Nicole Hamilton
Ja, ich habe nach Programmen gesucht, als ich auf dieses Szenario gestoßen bin, aber nicht alle Programme sind ausführbar. Mein Beispiel zeigt deutlich , dass die Dateien sein könnte .rar, .zip, .exeusw. daher der Titel und Fragen zu Dateien gezielt zu fragen.
Synetech
AFAIK die cmd.exe-Musterübereinstimmung unterstützt einfach nicht, was Sie wollen. Es ist nicht so toll.
Zoredache
Okay, suchen Sie nach Namen, die zipaußer in der Erweiterung enthalten sind?
Nicole Hamilton
@Zoredache, es ist ein merkwürdiger Mangel. ☹
Synetech

Antworten:

2

Problem

Das Auflisten aller Dateien zipim Basisnamen (vor dem letzten Punkt, falls vorhanden) ist aus zwei Gründen schwierig:

  • Windows hat nur zwei Platzhalter: *und ?.

    * Entspricht einer beliebigen Anzahl von Zeichen (einschließlich Null).

    ?Entspricht genau einem Zeichen (außer dem Punkt), es sei denn, es ist das letzte Zeichen des Musters, gefolgt von einem Punkt, nur anderen Platzhaltern oder nur anderen Platzhaltern und dann einem Punkt. 1

  • Es gibt keine tatsächliche Erweiterung in langen Dateinamen. Die GUI behandelt möglicherweise alles, was auf den letzten Punkt folgt, als Dateierweiterung, aber das ist nur eine Konvention.

    Hat .eine besondere Bedeutung in der Eingabeaufforderung. Vor LFN hatte jede Datei eine Erweiterung (obwohl sie leer sein könnte). Daher wurden *.*alle Dateien abgeglichen, während *nur Dateien mit einer leeren Erweiterung abgeglichen wurden.

    Aus Gründen der Abwärtskompatibilität wird .es ignoriert, wenn nur Platzhalter und andere Punkte folgen, es sei denn, die Punkte sind benachbart und werden von mindestens einem Platzhalter gefolgt, oder es gibt überhaupt keinen Platzhalter und höchstens einen einzelnen Stern vor dem Punkt. 1

Beispiele:

  • foo?.barstimmt mit der Datei überein, stimmt foo.baraber foo?barweder mit foobarnoch mit überein foo.bar.

  • *, *.*, *.*., *.*.*Und **.werden alle Dateien in einem bestimmten Ordner anzeigen lassen, während *., *..und *..*wird nicht.

Umgehung

Wenn Sie das Archivbit nicht zum Ausführen inkrementeller Sicherungen 2 verwenden , können Sie die Dateien, an denen Sie interessiert sind (und nur diese), nur mit DIR und dem Befehl ATTRIB anzeigen .

Schritte:

  1. Setzen Sie zunächst das Archivbit für alle Dateien, die zipirgendwo in ihren jeweiligen Dateinamen enthalten sind:

    ATTRIB +A *zip*
    
  2. Deaktivieren Sie jetzt das Archivbit für alle Dateien mit der zipErweiterung:

    ATTRIB -A *.zip
    

    Wenn Sie Dateien ausschließen möchten, deren jeweilige Erweiterung ebenfalls mit zip(z. B. ezip) endet , verwenden Sie stattdessen den folgenden Befehl:

    ATTRIB -A *.*zip
    

    Da *.*zipauch die 8.3-Dateinamen getestet werden, werden auch Dateien abgeglichen, deren jeweilige Erweiterung mit zip(z. B. zipx) beginnt , es sei denn, die 8.3-Dateinamen sind nicht vorhanden oder wurden geändert.

  3. Da der vorherige Befehl das Archivierungsbit für Dateien wie nanozip.zipdeaktiviert hat, setzen Sie diese zurück:

    ATTRIB +A *zip*.*zip
    
  4. Jetzt können Sie den /AASchalter des Befehls DIR verwenden, um nur Dateien mit einem gesetzten Archivbit anzuzeigen:

    DIR /AA *zip*
    

Mit dem /SSchalter auf DIR und dem /S [/D]Schalter auf ATTRIB funktioniert dies sogar für Dateien in Unterverzeichnissen.


1 Dies ist eher eine Liste von Macken als eine erschöpfende Erklärung des Wildcard-Verhaltens.

2 NTBackup von Windows XP berücksichtigt z. B. das Archivbit.

Dennis
quelle
Hmm, ich muss deine Antwort verpasst haben. Das ist ein kluger Trick. Eigentlich habe ich das Archivbit nicht (noch nie) verwendet (ich glaube, es ist hauptsächlich ein Überbleibsel aus alten DOS-Tagen), daher könnte dieser Trick tatsächlich eine vernünftige Umgehung sein. Es ist sinnvoll, die Erweiterung als Ziel festzulegen, sie im Wesentlichen "auszublenden", auf die verbleibenden zu zielen und dann wiederherzustellen. Ich rieche an einem Batch-Skript-Projekt… coming unless the 8.3 filenames aren't present or have been altered. Ich lasse 8.3 immer aktiv und ändere den gelegentlichen Dateinamen nur manuell, um Nicht-ASCII-Zeichen zu entfernen, damit sich Norton DiskEdit nicht beschwert ;-).
Synetech
Das habe ich auch angenommen. Sie haben an diesem Tag drei Antworten erhalten, von denen zwei ziemlich groß waren. Ja, das Archivbit wird kaum noch verwendet. Die letzte Desktop-Version von Windows, mit der Sie das Archivbit über die GUI ändern können, war XP, wenn ich mich nicht irre. Es war auch die letzte mit NTBackup gelieferte Version, die das Archivbit für inkrementelle Sicherungen verwendet.
Dennis
0

Kein netter, aber funktionierender.

dir | findstr ini..*

dotswerden als regulärer Ausdruck verwendet, bedeutet ein beliebiges Zeichen und *von 0 bis unendlich

Der einzige Nachteil ist, dass es keine Dateien ohne Erweiterung bearbeitet.

Woche
quelle
Wie der forBefehl funktioniert auch dies nicht, da alle anderen Informationen wie der Datenträgername, die Seriennummer, die Gesamtzahl der Bytes, die freien Bytes usw. entfernt werden.
Synetech
1
Ich nehme an du meintest dir | findstr zip .. *, aber das Problem (abgesehen von den weggelassenen Zeilen) ist, dass dies auch mit File.zipx und File.izipx übereinstimmt ( laut OP "können sie zip (in diesem Fall) auch in der Erweiterung haben, also solange sie es im Dateinamen haben ").
Karan
@ Karan: Sie haben Zitate verwendet - "Sie können auch zip... in der Erweiterung haben, ..." Wen / was zitieren Sie? Ich sehe diese Aussage nirgendwo anders auf dieser Seite.
Scott
@Scott: Erweitern Sie alle Kommentare zu der Frage selbst und schauen Sie genau hin - ich habe das OP zitiert, da dies seine Anforderungen sind.
Karan
@ Karan: Ups! Ich habe die versteckten Kommentare verpasst.
Scott
0

Wenn Sie bereit sind, "Augapfel" dann verwenden

dir / OE * zip *

Dadurch wird die Ausgabe nach Erweiterung sortiert, und die mit der Erweiterung .zip werden visuell ignoriert - alle werden zu einer Gruppe zusammengefasst.

Für eine Liste, die Sie untersuchen, massieren usw. können, senden Sie die Ausgabe in eine Datei:

dir / OE * zip *> myzip.txt


quelle
Ich bin mir nicht sicher, wie das helfen würde. Der /OSchalter ohne Parameter sortiert standardmäßig nach Dateiname (dh gleich /on). Die falschen Elemente (z. B. foobar.zip) würden weiterhin mit den legitimen Elementen durchsetzt.
Synetech
Ja, der Schalter sollte / OE
Leider würde es auch mit /oenoch zu viel manuelles "Augenzwinkern" erfordern, da die legitimen Dateien mit den falschen durchsetzt wären (z. B. nanaozip.zipirgendwo dazwischen liegen nabble.zipund quargle.zip- zum Beispiel -). Zugegeben, es würde es ein bisschen einfacher machen, da die fehlenden Einträge auf diese Weise weniger sind, aber es ist immer noch blasser als es sollte. :-DIch gebe hier +1, denn selbst wenn die falschen Einträge in der Mitte sind (z. B. dir / oe noo ), macht es das immer noch ein bisschen einfacher.
Synetech
@Synetech: Ich hatte Ihren Kommentar zweimal zu lesen , bevor ich , dass Ihr Punkt verstanden wurde , dass Sie Dateien aufnehmen mögen , die haben ZIPin ihrem Dateinamen, selbst wenn sie auch haben ZIPin ihrer Verlängerung (einen subtilen Punkt, den ich sehe nicht , Dinkel in Ihre Frage), und daher dir | findstr /i /v /r "\..*zip"wären zum Beispiel Antworten wie nicht akzeptabel. (Es wäre vielleicht klarer, wenn Sie gesagt hätten: "Da nur sehr wenige legitime Dateien mit den falschen durchsetzt wären.")
Scott,
@Synetech: (Fortsetzung) Die offensichtliche Antwort lautet: Führe die Antwort von darkphader (oder my findstr /v "\..*zip") aus und tue es dann dir *zip*zip*. Ich gehe davon aus, dass Sie keine Dateien haben, die ZIPdie Erweiterung zweimal haben . :)
Scott
0

Versuchen:

dir * | findstr / i zip. * \.

Lassen Sie das / i weg, wenn Sie nach Groß- und Kleinschreibung suchen möchten


quelle
Dadurch werden alle anderen Elemente dirwie der Name des Volumes, die Seriennummer, die Gesamtgröße, der freie Speicherplatz usw. entfernt dir. Außerdem werden keine Dateien aufgelistet, die keine Erweiterung haben (z. B. blahzip). Dies bedeutet, dass auch die meisten Verzeichnisse fehlen.
Synetech
Dadurch werden auch Dateien ohne Erweiterung ausgelassen.
Karan
Grundsätzlich müsste dann die zeilenweise Filterung der Ausgabe des Befehls "dir" nach den gewünschten Informationen die ersten 7 Zeilen überspringen, um das zu erreichen, was Sie wollen - Sie benötigen ein bisschen mehr Skripting.
Außerdem liefern weder der ls-Befehl über Cygwin noch der dir-Befehl in Powershell die gleichen Header-Informationen wie der dir-Befehl.
... oder Fußzeile. ☹
Synetech
0

Ähnlich wie bei der obigen Wochenlösung:

dir | findstr /e zip.*.[a-z]* 

Dies sollte alles finden, was "zip" enthält, gefolgt von einer beliebigen Anzahl von Zeichen, gefolgt von einem "." und eine beliebige Anzahl von Buchstaben, gefolgt vom Ende des Dateinamens. Habe ich noch etwas vermisst?

Llamanerds
quelle
2
Das würde sich nicht zeigen nanozip.zip.
Dennis
Wahr. Ich bearbeite das oben Gesagte, um dies zu berücksichtigen.
Llamanerds
Okay, ich bin neu hier. Was ist das Protokoll zur Korrektur einer Antwort? Im Moment habe ich es einfach durchgestrichen. Soll ich die falsche Antwort löschen?
Llamanerds
Das Ändern / Löschen falscher Teile einer Antwort ist in Ordnung. Sie sollten Markdown anstelle von HTML verwenden. In Markdown *wird zum Kursivsetzen verwendet.
Dennis
Dies stimmt fälschlicherweise auch mit File.zipx und File.izipx überein , abgesehen davon, dass die zusätzlichen Zeilen in einer normalen dir-Ausgabe weggelassen werden.
Karan,
0

Zum Testen sind dies einige gültige Dateinamen, die ich verwendet habe (dh solche, die irgendwo im Dateinamen "zip" haben, wobei die Erweiterung keine Rolle spielt):

zip
has zip
has zip text
zip.doc
textzip.txt
File.zip.txt
File - zip text.zip
this file name haszipin it.txt

Ungültige Dateinamen:

noname
File.xzip
File.zipx
File.azipx
File.bxzip
File name.zip

In Anbetracht der oben genannten Umstände und mangelnder Unterstützung für das "|" (oder) und "+" (eines oder mehrere) in findstr . Ich glaube, dass das, wonach Sie suchen, nicht nur mit Standard- Windows-Dienstprogrammen ausgeführt werden kann. Auch, während die andere dir Ausgangsleitungen wie jene , „Volumen“ oder „Verzeichnis“ oder „Bytes“ enthalten , können aufgenommen werden, indem finden oder findstr die Ausgabe filtern dir bedeutet automatisch , dass die passende Datei- und Verzeichnis Zählung falsch sein ( Es zeigt die Dateien und Verzeichnisse dirursprünglich gefunden, nicht die, die nach dem Filtern angezeigt werden). Aus dem gleichen Grund ist natürlich auch die Gesamtgröße der übereinstimmenden Dateien falsch, obwohl die freien Bytes korrekt sind, da dies nicht von den zurückgegebenen Ergebnissen abhängt.

Dies könnte möglich sein , eine verschlungene Batch- oder Powershell - Skript, aber wirklich, an diesem Punkt könnten Sie auch Ihr eigenes Programm in C oder ähnlichen Code.

Karan
quelle
Ja, das ist das Dilemma. Der dirBefehl scheint einen Fehler (oder bestenfalls einen gravierenden syntaktischen Mangel) zu haben, der verhindert, dass eine einfache Aufgabe funktioniert. Zugegeben, es gibt Tools, die Verzeichnislisten bereitstellen können, aber ich mag es nicht, Tools von Drittanbietern mit ihrer stark unterschiedlichen Ausgabe zu verwenden. Ich bin an das Ausgabeformat von gewöhnt dirund verlasse mich in einigen Fällen sogar darauf (zum Beispiel beim Vergleichen von Verzeichnislisten). ☹
Synetech
Ich glaube nicht, dass eine einfache Lösung ohne die Verwendung von Drittanbieter-Utils möglich ist, es sei denn, jemand schafft es, dies irgendwie zu knacken. Ich denke, Sie haben hier möglicherweise keine Wahl - leben entweder mit der Einschränkung oder finden einen besseren Dir- Ersatz.
Karan
Auch wenn Sie die vollständige Verzeichnisliste in eine Datei umleiten und ein reguläres Hilfsprogramm (z. B. Notepad ++) verwenden, um alle nicht übereinstimmenden Dateien zu entfernen, besteht weiterhin das Problem mit der Datei- / Verzeichnisnummer und -größe (in der Fußzeile des Verzeichnisses). . Die Filterung muss also grundsätzlich vom Dienstprogramm dir listing selbst durchgeführt werden, anstatt später zu filtern.
Karan,
Eigentlich habe ich schon nach einem dirErsatz gesucht . Leider muss ich noch einen guten finden (in der Tat habe ich im Allgemeinen nur wenige gesehen; die meisten sind GUIs, mit denen Sie eine Liste in einer Datei anstelle von Konsolentools speichern können). :-(
Synetech
Ich werde Sie wissen lassen, ob ich etwas finde, das zur Rechnung passt. In der Zwischenzeit gibt es einen Blogpost von Raymond Chen über Wildcards in DOS . Außerdem würde mich interessieren, ob die Art der Übereinstimmung, nach der Sie suchen (dh die Suche nach einer Zeichenfolge wie "zip" nur im Dateinamen und nicht in der Erweiterung), auch mit Advanced Query Syntax in Windows möglich ist.
Karan,
0

Diese Batchdatei sollte für Sie funktionieren.

Wenn Sie es ohne Befehlszeilenargumente ausführen, wird eine Liste wie folgt angezeigt:

"dir *zip*.*"

Es werden jedoch Dateien herausgefiltert, die im "name" -Teil des Dateinamens kein "zip" enthalten (die Erweiterung wird ignoriert). Ich habe angenommen, dass ein Dateiname, der "zip" im Namen und Erweiterung enthält, eine gültige Übereinstimmung ist, wie:

somezipfile.zip

Wenn Sie es mit einem Argument (wie "txt" oder "txt" oder "beliebiger Text") ausführen, wird es dasselbe tun, außer das angegebene Argument anstelle von "zip" zu verwenden.

Diese Batch-Datei zeigt auch die richtige Dateianzahl und Dateigrößenübersicht an.

Bitte lassen Sie mich wissen, wenn es nicht das tut, was Sie brauchen.

@echo off



set "zfind=%~1"
if "%zfind%."=="." set "zfind=zip"

set "zpattern=*%zfind%*.*"
set "zhold="
set zcount=0
set zgotbslash=0



for %%f in ("%zpattern%") do call :work1 "%%~nf" "%%~xf"



if NOT %zcount% EQU 0 goto :start2

rem no matches. look for something that "for sure" won't be found.
set zhold="<[nothing]>"
goto start2



:start2
set "zrandom=%random%.%random%.%random%.%random%.tmp"
if exist "%zrandom%" del "%zrandom%" >nul 2>&1
dir %zhold%>>"%zrandom%" 2>>&1



for /f "usebackq delims=" %%f in ("%zrandom%") do call :work2 "%%~f"



echo.
if exist "%zrandom%" del "%zrandom%" >nul 2>&1
goto :cleanexit



:work1

set "znam=%~1"
set "zext=%~2"



for /f "usebackq delims=" %%g in (`echo set "ztest=%%znam:%zfind%=%%"`) do %%g



rem if "%ztest%" equals "%znam%" then 
rem file "name" did NOT contain the search text.. skip it

if "%ztest%."=="%znam%." goto :work1skip
goto :work1match



:work1match
rem got a match

set zhold=%zhold% "%znam%%zext%"
set /A zcount=zcount+1
goto :EOF



:work1skip
rem skip this one

goto :EOF



:work2

set "zline=%~1"

rem if we already printed the " Directory of d:..." line then:
if %zgotbslash% EQU 1 goto :work2part2

rem looking for "\"
call :testbslash
if %zres% EQU 1 goto :work2gotbslash


echo %zline%
goto :EOF



:work2gotbslash
set zgotbslash=1
echo.
echo %zline%
echo.
goto :EOF



:work2part2
call :testbslash
if %zres% EQU 0 echo %zline%
goto :EOF



:testbslash
set zres=1
set "ztest=%zline:\=%"
if "%ztest%."=="%zline%." set zres=0
goto :EOF




:cleanexit

set "zcount="
set "zext="
set "zfind="
set "zgotbslash="
set "zhold="
set "zline="
set "znam="
set "zpattern="
set "zrandom="
set "zres="
set "ztest="
goto :EOF
Kevin Fegan
quelle
-1

Heutzutage gibt es keinen guten Grund, cmd.exe zu verwenden. Power Shell:

dir | ? {$_.BaseName.Contains('zip')}
dangph
quelle
Das ist keine Antwort auf die gestellte Frage. Ich kenne PowerShell sehr gut (und mag es aus zahlreichen Gründen überhaupt nicht). Außerdem gibt es viele Programme, die eine Verzeichnisliste bereitstellen können. Wenn ich also anstelle der Eingabeaufforderung ein anderes Programm verwenden möchte, würde ich nur eines davon verwenden. Schließlich ist die Ausgabe von dirin PS völlig anders als die der Eingabeaufforderung, so dass es, wie ich in der Frage sagte, sowieso keine Option ist.
Synetech
@Synetech, es hört sich so an, als würden Sie die Tatsache beklagen, dass etwas, das alt und kaputt ist, alt und kaputt ist, aber Sie möchten nichts Besseres tun.
dangph
Falsch, nicht alles zählt. Wenn es so schlimm wäre, wie Sie behaupten, würden sie es nicht mehr in Windows aufnehmen, aber sie tun es. Nur weil es einen Bug hat, heißt das nicht, dass es alt oder kaputt ist. PS ist keineswegs das A und O, sondern ein absoluter Ersatz für die Eingabeaufforderung, und es ist absurd zu erwarten, dass jeder dazu gezwungen wird, zu dieser Eingabeaufforderung zu wechseln. Außerdem ist Power kein Ersatz für die Eingabeaufforderung überhaupt ; es ist eine ganz andere Sache, die nur ähnlich ist. Wenn Sie der Meinung sind, dass PS "cmd +" ist oder die Eingabeaufforderung ersetzt werden soll, verstehen Sie den Zweck falsch.
Synetech
@Synetech, sie können es nicht loswerden, weil die Leute es immer noch benutzen. Und es gibt viele BAT-Dateien da draußen. Warum möchten Sie Ihren freien Speicherplatz jedes Mal wissen, wenn Sie ein Verzeichnis erstellen? Haben Sie Angst, auf Ihren Disketten keinen Platz mehr zu haben? Ich benutze PS seit Ewigkeiten als Kommandozeilen-Shell. Es funktioniert wirklich gut Es funktioniert sogar besser als die Unix-Shells. Was würdest du sagen, wozu es dient?
dangph