Forum: PC Hard- und Software Windows-Wildcards


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,

ist es möglich, unter Windows 7 in der Kommandozeile Dateien mit 
Wildcards der Art zu finden, daß mehrere Fragmente zur Auswahl stehen. 
Also etwas, was mit regulären Ausdrücken so aussähe:
1
dir *.{jpg|png}

Viele Grüße
W.T.

von Teo D. (teoderix)


Lesenswert?

1
Dir *.jpg *.png

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

1
dir *.jpg *.png

Das kommt dem, was Du willst, schon recht nahe, nur daß es zwei Listen 
nacheinander ausgibt und jede mit der Überschrift "Verzeichnis von ..." 
versehen wird.

Wenn Du nur die Dateinamen und sonst nichts aufgelistet bekommen willst, 
schreib's so:
1
dir *.jpg *.png /b

Sortieren geht dann mit /on (Dateiname) oder /od (Datum), bzw /o-n und 
/o-d in umgekehrter Reihenfolge.

von Walter T. (nicolas)


Lesenswert?

Hallo Dietrich, danke für die schnelle Antwort.

Teo D. schrieb:
> Dir *.jpg *.png

OK, "dir" war vielleicht ein ungünstiges Beispiel. Vielleicht hätte ich 
besser "icalcls" nehmen sollen, das nur einen "Dateinamen" als Eingabe 
erwartet - um diesen Befehl geht es mir nämlich.

Also vom Prinzip her:
1
icacls *.(pdf|png)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Auswertung von Wildcards erfolgt unter Windows vom jeweiligen 
Programm selbst - das ist anders als in den üblichen *nix-Shells und 
Grund für Flamewars und eingeschlagene Köpfe.

Wenn icacls nur ein Argument verkraftet, musst Du es pro Argument erneut 
aufrufen.

von Walter T. (nicolas)


Lesenswert?

Hallo Rufus,

danke für die Antwort. Sie ermöglicht mir, die Frage besser zu 
formulieren:

"Ist es mit Windows-Wildcards möglich, Dateien mit unterschiedlichen 
Endungen zu einem einzigen Argument zu machen?"

Ich hatte damit gerechnet, daß es für den Eingeweihten kein Problem 
darstellt (nur irgendwie eine merkwürdige Klammersetzung erfordert).

Hintergrund der Geschichte ist der folgende Thread:

Beitrag "Windows 7: Dateirechte für Dateitypen"

Ich will vielen (vielen!) Dateien mit insgesamt drei unterschiedlichen 
Dateiendungen regelmäßig besondere Rechte zuweisen. Dateien mit anderen 
Endungen sollen in Ruhe gelassen werden. Damit wird der Aufruf von 
"icacls" zu einer ziemlich langen Zeile in einem Script. Wenn ich diese 
lange Zeile im Script für jede Dateiendung kopieren muß,

 a) braucht das Skript länger (getestet: 100 Dateien mit den Endungen 
".1pg" und ".2pg" entweder mit dem Aufruf "icalcs *.?pg [...]" oder mit 
zwei getrennten Aufrufen - es scheint genau doppelt so lange zu dauern. 
Wahrscheinlich durchsucht er die Verzeichnisstruktur jedesmal neu.) und

 b) rechne ich damit, daß bei den ersten Änderungen diese drei Zeilen im 
Laufe der Zeit inkonsistent werden - man kennt das ja.

Deswegen hätte ich gerne einen Einzeiler. Aber wenn es nicht geht, geht 
es nicht.

EDIT: Heute zu viele Texte mit schlechter Rechtschreibung gelesen. Das 
färbt ab. :-(

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Walter T. schrieb:
> "Ist es mit Windows-Wildcards möglich, Dateien mit unterschiedlichen
> Endungen zu einem einzigen Argument zu machen?"

Nur, wenn es das die Wildcards auswertende Programm ermöglicht.

Nochmal:

Das entscheidet das Programm, das Du mit Wildcards verwendest.

> Ich will vielen (vielen!) Dateien mit insgesamt drei unterschiedlichen
> Dateiendungen regelmäßig besondere Rechte zuweisen.

Mir erscheint der Ansatz ... fragwürdig. Zwar scheint Dein Lösungsansatz 
nicht völlig unmöglich zu sein, aber damit behebst Du nur Symptome eines 
anderswo gelagerten Problemes.

von Beautifier (Gast)


Lesenswert?

Walter T. schrieb:

> Deswegen hätte ich gerne einen Einzeiler. Aber wenn es nicht geht, geht
> es nicht.

Geht (Beispiel):

for %X in (*.jpg *.png) do @echo %X

Klappert allerdings ebenfalls zweimal das Verzeichnis ab.

> "Ist es mit Windows-Wildcards möglich, Dateien mit unterschiedlichen
> Endungen zu einem einzigen Argument zu machen?"

Nein, nicht mit den Mitteln von Cmd. Mit der Powershell schon, dann 
wird's aber wiederum kein handlicher Einzeiler mehr.

von Walter T. (nicolas)


Lesenswert?

Rufus Τ. F. schrieb:
> Das entscheidet das Programm, das Du mit Wildcards verwendest.

Klar. Wobei ich annehme, daß bei den einzelnen Kommandos die Attribute 
halbwegs konsistent sind.

Rufus Τ. F. schrieb:
> Zwar scheint Dein Lösungsansatz
> nicht völlig unmöglich zu sein, aber damit behebst Du nur Symptome eines
> anderswo gelagerten Problemes.

Das stimmt. Das Problem liegt darin, daß ich veränderbare und geschützte 
Dateien innerhalb der selben Ordnerstruktur unterbringen muß (siehe der 
andere Thread), um ein versehentliches Ändern der einen Dateien zu 
verhindern und das Ändern der anderen Dateien so leicht wie möglich zu 
machen.

Edit:

Problem "b)" ist ja eigentlich keins - ich kann ja die Kommandoparameter 
in einen String packen.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Walter T. schrieb:
> Wobei ich annehme, daß bei den einzelnen Kommandos die Attribute
> halbwegs konsistent sind.

Das sind sie nicht. Das ist Windows, da arbeiten unterschiedliche Teams, 
die komplett unterschiedliche Vorstellungen davon haben, wie so etwas 
aussieht.

Vergleiche einfach mal den grundlegenden Aufbau der 
Kommandozeilenargumente der alten, von DOS geerbten Kommandos mit so 
etwas wie taskkill.

von Carsten P. (r2pi)


Lesenswert?

Walter T. schrieb:
> Das stimmt. Das Problem liegt darin, daß ich veränderbare und geschützte
> Dateien innerhalb der selben Ordnerstruktur unterbringen muß (siehe der
> andere Thread), um ein versehentliches Ändern der einen Dateien zu
> verhindern und das Ändern der anderen Dateien so leicht wie möglich zu
> machen.

Wir sind doch Hacker hier. Also hacke was. Im .NET-Framework (geht auch 
mit Mono, wenn auch nicht so "smart") gibt es den FileSystemWatcher, der 
sogar recht freundlich im Sinne von CPU-Belastung ist. Den setzt du mit 
ein paar Zeilen Code auf deine Verzeichnisse an und lässt ihn das tun, 
was du möchtest.

Der FSW schaut je nach Suchmaske nach Dateien, an denen sich was ändert. 
Du kannst da alles Mögliche veranstalten. Wenn du den Code dann noch in 
einen Windows-Dienst packst, der beim Rechner-Start mit hochgefahren 
wird, wird alles gut. Und sei beruhigt, auch wenn das nach ganz großem 
Theater klingt, ist es nicht mehr als ein bisschen im MSDN lesen und ein 
paar Millisekunden mehr beim Hochfahren für "yet another service to 
run".

Codebeispiel:
1
namespace FSW
2
{
3
  using System;
4
  using System.Collections.Generic;
5
  using System.IO;
6
7
    static public class FSW
8
    {
9
      const string _folder = "C:\\Temp";
10
      static IDictionary<string, KeyValuePair<NotifyFilters, Action<string>>> _whatToDo; 
11
12
      static public void Main()
13
      {
14
      InitializeComponent();
15
16
        foreach (var w in _whatToDo)
17
        {
18
          var fsw = new FileSystemWatcher(w.Key)
19
              {
20
                EnableRaisingEvents = true,
21
                NotifyFilter = w.Value.Key
22
              };
23
          var w1 = w;
24
          fsw.Changed += (sender, args) => w1.Value.Value(args.Name);
25
        }
26
27
        var exit = false;
28
29
        while (!(exit))
30
        {
31
          if (File.Exists(_folder + "\\stop"))
32
            exit = true;
33
        }
34
      }
35
36
      static void InitializeComponent()
37
      {
38
        _whatToDo = new Dictionary<string, KeyValuePair<NotifyFilters, Action<string>>>();
39
40
        Action<string> readOnlyMaker = (f => File.SetAttributes(f, FileAttributes.ReadOnly));
41
        Action<string> deleter = (File.Delete);
42
43
      _whatToDo.Add(new KeyValuePair<string, KeyValuePair<NotifyFilters, Action<string>>>("*.jpg", new KeyValuePair<NotifyFilters, Action<string>>(NotifyFilters.LastWrite, readOnlyMaker)));
44
      _whatToDo.Add(new KeyValuePair<string, KeyValuePair<NotifyFilters, Action<string>>>("*.png", new KeyValuePair<NotifyFilters, Action<string>>(NotifyFilters.Attributes, deleter)));
45
      }
46
    }
47
}

Ist also keine große Magie oder Hexerei, nur bissel C# Code, den du mit 
den Bordmitteln von Windows und .NET ganz entspannt übersetzen kannst, 
sogar ohne installiertes Visual Studio.

Und jo, der Code ist nicht verlässlich, es soll ja auch nur den Weg zum 
Ziel aufzeigen. Das "KeyValuePair" habe ich aus Zeitgründen benutzt. Mit 
einem "Tuple" sieht es hübscher aus.

LG
Carsten

von Carsten P. (r2pi)


Lesenswert?

PS: Die \[c\] Formatierung ist übrigens echt potthässlich, liebe Admins. 
BitteDanke.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Carsten P. schrieb:
> Im .NET-Framework (geht auch mit Mono, wenn auch nicht so "smart") gibt
> es den FileSystemWatcher,

Den gibt es auch auf Betriebssystemebene mit den Win32-API-Funktionen 
FindFirstChangeNotification, FindNextChangeNotification & Co., so 
daß man nicht auf .Net angewiesen ist, um das nutzen zu können.

von c-hater (Gast)


Lesenswert?

Walter T. schrieb:

> Das stimmt. Das Problem liegt darin, daß ich veränderbare und geschützte
> Dateien innerhalb der selben Ordnerstruktur unterbringen muß (siehe der
> andere Thread), um ein versehentliches Ändern der einen Dateien zu
> verhindern und das Ändern der anderen Dateien so leicht wie möglich zu
> machen.

Schonmal was von Links gehört?

von Walter T. (nicolas)


Lesenswert?

c-hater schrieb:
> Schonmal was von Links gehört?

Ja, aber ich wüßte nicht, wie mir das weiterhelfen sollte. Schließlich 
muß ein NTFS-Link für jede Datei einzeln erstellt werden - was in etwa 
ähnlich aufwendig ist, wie die Rechte Dateiweise zu verteilen.

von Walter T. (nicolas)


Lesenswert?

Carsten P. schrieb:
> [etwas Quelltext und längliche Erklärung]

Ehrlich gesagt verstehe ich nicht, was einem Stück .NET-Code einfacher 
oder zuverlässiger sein soll, als in einem vierzeiligen CMD-Script die 
Schreibrechte zu setzen.

von Carsten P. (r2pi)


Lesenswert?

Walter T. schrieb:
> Carsten P. schrieb:
>> [etwas Quelltext und längliche Erklärung]
>
> Ehrlich gesagt verstehe ich nicht, was einem Stück .NET-Code einfacher
> oder zuverlässiger sein soll, als in einem vierzeiligen CMD-Script die
> Schreibrechte zu setzen.

Es war nur ein Vorschlag, genauso sinnvoll wie eine Aussage wie "Ich 
muss les/schreibbare und sicherheitsrelevante Dateien im selben Ordner 
unterbringen." Wenn dir das ein Kunde sagt, hoffe ich, dass du ohne den 
Kunden auskommst. Man trennt auch unter Windows Dateien mit 
verschiedenen Zugriffsbedürfnissen (nicht: Rechten) möglichst weit 
voneinander weg.

Die üblichste Begründung für solch einen Eingriff in die auch nur 
allereinfachsten Dinge in Sachen Sicherheit ist, dass die Mitarbeiter 
sonst nicht zurecht kommen. Dann taugen die Mitarbeiter nichts, weil sie 
nicht entsprechend geschult sind, weil ihr Arbeitgeber ein geiziges 
Ar*** ist, und dann solltest du gehen -- wie gesagt, wenn du es dir 
leisten kannst.

von Alex W. (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
>
1
dir *.jpg *.png
>
> Das kommt dem, was Du willst, schon recht nahe, nur daß es zwei Listen
> nacheinander ausgibt und jede mit der Überschrift "Verzeichnis von ..."
> versehen wird.
>
> Wenn Du nur die Dateinamen und sonst nichts aufgelistet bekommen willst,
> schreib's so:
>
>
1
dir *.jpg *.png /b
>
> Sortieren geht dann mit /on (Dateiname) oder /od (Datum), bzw /o-n und
> /o-d in umgekehrter Reihenfolge.

Hi Rufus,

mit dieser Info wirst du den Groll der Linuxgemeinde auf dich ziehen ;-)

von Carsten P. (r2pi)


Lesenswert?

Alex W. schrieb:
> mit dieser Info wirst du den Groll der Linuxgemeinde auf dich ziehen ;-)

You made my day! `;D thumbup

von Krigl (Gast)


Lesenswert?

> Hi Rufus, ...

Bist Du sicher, dass der überhaupt noch lebt?

von tut nix zur Sache (Gast)


Lesenswert?

Walter T. schrieb:
> Das stimmt. Das Problem liegt darin, daß ich veränderbare und geschützte
> Dateien innerhalb der selben Ordnerstruktur unterbringen muß (siehe der
> andere Thread), um ein versehentliches Ändern der einen Dateien zu
> verhindern und das Ändern der anderen Dateien so leicht wie möglich zu
> machen.

Würd ich nen Git-Repo als Sicherheit drunter packen, dann Skript 
ausführen und checken obs passt. Sich nur auf nen Skript zu verlassen 
(ob nu C#, Batch oder weiß-der-Fuchs-was), wär mir da zu heiß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.