Wie bekomme ich die Befehle "dir" und "copy", um mit "* .xyz" zu arbeiten, aber nicht mit "* .xyz ~"?

1653
pauldoo

Wenn ich copy *.txt somefolder\das System benutze, scheint es, auch alle *.txt~Dateien zu kopieren, was ich nicht will. Ein ähnlicher Effekt kann bei folgenden Effekten beobachtet werden dir:

C:\Users\Paul\Documents\Programs\Proffy>dir *.txt Volume in drive C is Vista Volume Serial Number is EC23-AD6B  Directory of C:\Users\Paul\Documents\Programs\Proffy  29/11/2008 13:54 35,821 COPYING.txt 31/10/2009 21:54 1,644 INSTRUCTIONS.txt 06/06/2009 15:57 1,393 INSTRUCTIONS.txt~ 04/01/2009 11:59 116 Notes.txt 19/04/2009 16:53 134 README.txt 04/01/2009 12:42 132 README.txt~ 31/10/2009 21:30 197 TODO.txt 31/10/2009 19:10 414 TODO.txt~ 8 File(s) 39,851 bytes 0 Dir(s) 41,938,862,080 bytes free  C:\Users\Paul\Documents\Programs\Proffy> 

Wie kann dirund kann ich copynur Dateien bearbeiten, die mit enden .txtund nicht .txt~?

4
Als ich diese Frage zum ersten Mal sah, dachte ich, "ja, das ist nützlich und klar", also hob ich sie auf. Dann fügte ich eine Antwort hinzu, die zu dem Schluss kam, dass sie als etwas Besonderes betrachtet werden, um Sie daran zu erinnern, sie umzubenennen oder zu löschen. Während ich redigierte, wurde ich von jemandem abgelehnt, ohne zu erklären, warum. Dies hinterlässt einen unangenehmen Geschmack in meinem Mund, aber ich bekam die Meldung "Hilfe nicht gewünscht". pavium vor 14 Jahren 1

6 Antworten auf die Frage

5
Joey

Anscheinend berücksichtigt die Shell sowohl den kurzen als auch den langen Namen für die Erweiterung von Platzhaltern. Eine ausführlichere Erklärung finden Sie in der Antwort von shf301 . Dies ist bedauerlich und wahrscheinlich ein Überbleibsel von Ye Olde Days of DOS, weil damit cmdversucht wird, irgendwie kompatibel zu sein.

Mehrere Optionen hier:

  1. Verwenden Sie forfileseine andere Semantik für die Wildcard-Erweiterung:

    forfiles /m *.txt /c "cmd /c copy @file foo" 

    Dies ist mindestens unter Vista und höher verfügbar.

  2. Verwenden forund überprüfen Sie die Erweiterung:

    for %a in (*.txt) do @if %~xa==.txt @copy "%i" foo 

    Gibt leider forauch Dateien mit der .txt~Erweiterung zurück, wenn nur die Erweiterung mit Platzhaltern verwendet wird. Deshalb müssen wir die Erweiterung ein zweites Mal überprüfen.

  3. Verwenden xcopy. Während xcopyfür die Platzhaltererweiterung die gleiche Semantik wie für die Shell gilt, können Sie ihr eine Datei mit zu ignorierenden Namen zuweisen:

    echo .txt~>tmpfile xcopy *.txt foo /exclude:tmpfile del tmpfile 
  4. Verwenden robocopy. Während robocopyfür die Platzhaltererweiterung die gleiche Semantik wie für die Shell gilt, können Sie ihr eine Liste von zu ignorierenden Dateien / Platzhaltern zuweisen:

    robocopy . foo *.txt /XF *.txt~ 
  5. Verwenden for, dirund findstrin einer geeigneten Kombination. Dies filtert im Wesentlichen nur alle Zeilen heraus, die ~am Ende ein und das übrige funktionieren. Die ifVariante oben war eleganter, finde ich.

    for /f "usebackq delims=" %i in (`dir /b *.txt ^| findstr /r "[^~]$"`) do @copy "%i" foo 
  6. Nur zur Vollständigkeit: PowerShell:

    Copy-Item *.txt foo 
1
shf301

Ich bin nicht sicher, wie ich dir / copy davon abhalten kann, nur * .txt zu finden, aber ich kann erklären, warum * .txt das zurückgibt, was es tut. Er stimmt mit dem kurzen Dateinamen überein, der für alle Dateien mit .txt endet. Führen Sie ein Verzeichnis dir / x * .txt aus, um dies anzuzeigen. Dieses Problem tritt für jeden Satz von Erweiterungen auf, der mit den gleichen ersten drei Zeichen beginnt (z. B. stimmt * .htm mit htm, html und sogar htmlasdfasdf überein).

Die meisten Windows-Anwendungen verhalten sich auch so, weil die API, die das Betriebssystem zum Suchen nach Dateien bereitstellt, FindFirstFile den langen Dateinamen und den kurzen Dateinamen entspricht. Zitieren:

Die Suche umfasst die langen und kurzen Dateinamen.

Sie müssen eine benutzerdefinierte Filterung durchführen, wie von Johannes Rössel vorgeschlagen.

1
pauldoo

Meine Lösung war del *.xyz~vor meiner Ausführung copy *.xyz. Nicht brillant, aber es funktioniert.

+1. D'oh! Dinge in der richtigen Reihenfolge zu tun, ist ein Trumpf, der alle coolen Befehle kennt, die andere anbieten. beggs vor 14 Jahren 0
Nun, ich gehe zunächst nicht davon aus, dass Leute bereit sind, Dateien wegzuwerfen :-) Joey vor 14 Jahren 0
Dies ist keine richtige Antwort auf Ihre eigene Frage, sorry. Das Löschen von Brute-Force-Dateien ist KEINE Lösung. Breakthrough vor 13 Jahren 0
0
JdeBP

Da Joey Vollständigkeit halber erwähnt, stellt ich fest, wie erwähnt hier, dass dies variiert je nach dem, was Dolmetscher Befehl DIRund COPYBefehle verwendet man . Der DIRBefehl in Take Command und seinem COPYBefehl, für Beispiele, nur lange Namen von Standard entsprechen und so kann dieses Verhalten nicht zeigen. (Das Abgleichen von kurzen und langen Namen kann aus Kompatibilitätsgründen mit CMDs DIRund COPYBefehlen aktiviert werden.)

0
Dennis

Das vorhandene Antwort-Cover, das Dateien kopiert, ist einfach gefallen, jedoch nicht aufgeführt.

Sie können das Archivbit für beide Zwecke verwenden. Obwohl es für die Verwendung mit XCOPY 1 vorgesehen ist, funktioniert es auch mit DIR 2 .

Schritte:

  1. Stellen Sie sicher, dass das Archivbit für alle .txtDateien festgelegt ist:

    ATTRIB +A *.txt 
  2. Entfernen Sie das Archivbit aus allen .txt~Dateien:

    ATTRIB +A *.txt~ 
  3. Listet alle .txtDateien auf, deren Archivbit gesetzt ist:

    DIR /AA *.txt 

    oder kopiere sie nach somefolder:

    XCOPY /A *.txt somefolder/ 

1 XCOPY verwendet den /ASchalter, um alle Dateien auszuschließen, für die das Archivbit nicht gesetzt ist. Damit können bestimmte Dateien (z. B. temporäre Dateien) von täglichen Sicherungen ausgeschlossen werden. Mit dem /MSwitch wird auch das Archivbit aus den Dateien entfernt. Dies ist beim Kopieren von Dateien auf kleine Speichermedien (z. B. Disketten) hilfreich. Durch das Ändern einer Datei wird auch das Archivbit automatisch festgelegt, sodass der /MSwitch für inkrementelle Sicherungen verwendet werden kann.

2 DIR /AA zeigt nur Dateien, deren Archivattribut gesetzt ist.

-1
eqzx

Sie könnten es versuchen: "* .txt" kopieren

Das ist * genau * das Gleiche wie ohne die Anführungszeichen. Also, was soll das leisten? Joey vor 14 Jahren 0
Es scheint, als würde das Suffix '~' nicht angezeigt. Daher benutzte ich den Satz "könnte versuchen". eqzx vor 14 Jahren 0