PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Batchdateien kopieren, aber nur aus bestimmten Ordnern


Korfox
2023-05-16, 14:16:37
Moin.
Ich sitze gerade völlig auf dem Schlauch.
Ich habe eine Ordnerstruktur und in mehreren Ordnern kommen Dateien nach dem Schema "*_KorfoxIstDoof.pdf" vor.

Ich möchte alle diese Dateien alle raus kopieren (soweit so gut):
for /r %x in (*_KorfoxIstDoof.pdf) do copy %x

Jetzt möchte ich aber nur Dateien von einer bestimmten Person kopieren:
..\A\b\c\Peter\e\Der_korfoxIstDoof.pdf möchte ich kopieren.
..\B\D\e\f\Peter\a\f\s\Nur_KorfoxIstDoof.pdf möchte ich kopieren.
..\A\b\c\Max\e\NichtNur_KorfoxIstDoof.pdf möchte ich nicht kopieren.

Ich habe dabei zwei potentielle Kriterien, die gleichwertig sein dürften:
Es darf "Max" nicht im Pfad vorkommen, oder es muss "Peter" im Pfad vorkommen.
But how? (Gerne per direktem CMD-Kommando, batch oder PowerShell)

Monger
2023-05-16, 14:45:53
In Powershell:


Get-ChildItem -Path MeinRootOrdner -recurse | where { $_.Name -match '_KorfoxIstDoof\.pdf' } | Copy-Item -Destination C:\foo

Korfox
2023-05-16, 14:48:09
Da fehlt mir die Entscheidung "Max darf nicht im Pfad vorkommen" oder "Peter muss im Pfad vorkommen".

Monger
2023-05-16, 15:18:59
Get-ChildItem -Path MeinRootOrdner -recurse `
| where { $_.FullName -match '\\peter\\' } `
| where { $_.Name -match '_KorfoxIstDoof\.pdf' } | Copy-Item -Destination C:\foo

Korfox
2023-05-16, 18:07:30
Danke. Ich das hilft mir sehr, glaube ich :).

Monger
2023-05-16, 18:38:17
Mini Hinweis noch: meine Implementierung ist nicht superschnell, weil er sich erst alle Dateien holt und dann filtert. Get-ChildItem hat auch ein Filter Property, ähnlich der Windows Explorer Suche, womit man direkt aufm Dateisystem filtern kann, und das geht dann deutlich schneller. Aber den Filter gescheit zu formulieren ist total stressig, und meistens kommt man mit Regex aufm Dateipfad einfach schneller vorwärts.

Korfox
2023-05-17, 09:40:46
Danke und das ist relativ egal. Es müssen nur ca. 60000 Dateien durchsucht werden. Und alles ist schneller als die Alternative ein Groovy-Script zu nehmen.

GanjaBob
2023-05-17, 11:14:01
Du kannst auch zusätzlich zum "-match" das "-notmach" für den exclude nutzen.
https://ss64.com/ps/syntax-regex.html

Korfox
2023-05-17, 13:29:41
Danke, das ist dann schon klar. PowerShell habe ich tatsächlich fast noch nie benutzt, aber grundsätzlich ist das Verständnis dann schon da :D. Und bei Batch stand (und stehe ich nach wie vor) halt völlig auf dem Schlauch. Die Buildumgebung kann aber, wie gesagt, auch PowerShell und Groovy.
Der Einzeiler oben tut exakt was ich erwarte (braucht ca. 10-20 Sekunden, was den Buildprozess nicht merklich verlangsamt). Ob ich black- oder whitelisten muss wird die Zeit sagen. Aber grundsätzlich ist das so super.

Morgenlicht
2023-05-19, 00:20:29
Vielleicht sollte dem get-ChildItem noch das -Force mitgegeben werden. Falls Datei-Attribute wie "versteckt" gesetzt sind.