Wie eine Verzeichnisstruktur kopieren, sondern nur schließen bestimmte Dateien (Windows Batch-Dateien)

StackOverflow https://stackoverflow.com/questions/472692

Frage

Wie der Titel schon sagt, wie kann ich rekursiv eine Verzeichnisstruktur kopieren, sondern sind nur einige Dateien. Z. B die folgende Verzeichnisstruktur gegeben:

folder1
  folder2
    folder3
      data.zip
      info.txt
      abc.xyz
    folder4
    folder5
      data.zip
      somefile.exe
      someotherfile.dll

Die Dateien data.zip und info.txt können überall in der Verzeichnisstruktur angezeigt. Wie kann ich kopieren Sie die vollständige Verzeichnisstruktur, sondern nur Dateien mit dem Namen data.zip und info.txt sind (alle anderen Dateien ignoriert werden sollen)?

Die resultierende Verzeichnisstruktur soll wie folgt aussehen:

copy_of_folder1
  folder2
    folder3
      data.zip
      info.txt
    folder4
    folder5
      data.zip
War es hilfreich?

Lösung

Sie erwähnen nicht, wenn es nur sein Batch hat, aber wenn Sie ROBOCOPY verwenden können, versuchen Sie dies:

ROBOCOPY C:\Source C:\Destination data.zip info.txt /E

EDIT:. Changed die /S Parameter /E leere Ordner enthalten

Andere Tipps

Eine alternative Lösung, die kopiert eine Datei auf einmal und nicht ROBOCOPY erfordert:

@echo off
setlocal enabledelayedexpansion

set "SOURCE_DIR=C:\Source"
set "DEST_DIR=C:\Destination"
set FILENAMES_TO_COPY=data.zip info.txt

for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
    if exist "%%F" (
        set FILE_DIR=%%~dpF
        set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
        xcopy /E /I /Y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
    )
)

Die äußere for-Anweisung erzeugt einen möglichen Pfad Kombination von Unterverzeichnis in SOURCE_DIR und Namen in FILENAMES_TO_COPY. Für jede vorhandene Datei xcopy aufgerufen. FILE_INTERMEDIATE_DIR hält das Unterverzeichnis Pfad der Datei innerhalb SOURCE_DIR, die in DEST_DIR erstellt werden muss.

versuchen Ausgabe von find kochend (dh. Der Dateipfad) in cpio

find . -type f -name '*.jpg' | cpio -p -d -v targetdir/

cpio prüft Zeitstempel auf Zieldateien -. So seine sichere und schnelle

entfernen -v für eine schnellere op, wenn Sie sich daran gewöhnen.

Wenn Powershell ist eine Option, Sie können dies tun:

Copy-Item c:\sourcePath d:\destinationPath -filter data.zip -recurse

Der größte Nachteil ist es kopiert alle Ordner, auch wenn sie leer ist, wird am Ende, da keine Dateien mit dem Filter, den Sie angeben, entsprechen. So könnte man mit einem Baum voll von leeren Ordner landen, zusätzlich zu den wenigen Ordner, der die Dateien haben Sie wollen.

Danke Zur vorherigen Antworten. :)

Dieses Skript namens "r4k4copy.cmd":

@echo off
for %%p in (SOURCE_DIR DEST_DIR FILENAMES_TO_COPY) do set %%p=
cls
echo :: Copy Files Including Folder Tree
echo :: http://stackoverflow.com
rem     /questions/472692/how-to-copy
rem     -a-directory-structure-but-only
rem     -include-certain-files-using-windows
echo :: ReScripted by r4k4
echo.
if "%1"=="" goto :NoParam
if "%2"=="" goto :NoParam
if "%3"=="" goto :NoParam
setlocal enabledelayedexpansion
set SOURCE_DIR=%1
set DEST_DIR=%2
set FILENAMES_TO_COPY=%3
for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
if exist "%%F" (
set FILE_DIR=%%~dpF
set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
xcopy /E /I /Y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
)
)
goto :eof
:NoParam
echo.
echo Syntax: %0 [Source_DIR] [Dest_DIR] [FileName]
echo Eg.   : %0 D:\Root E:\Root\Lev1\Lev2\Lev3 *.JPG
echo Means : Copy *.JPG from D:\Root to E:\Root\Lev1\Lev2\Lev3

Er akzeptiert Variable „Quelle“, „Ziel“ und „Dateiname“. Es kann auch nur das Kopieren von bestimmten Art von Dateien oder selektiver Dateinamen.

sind Jede Verbesserung willkommen. :)

Mit Suchen und cp nur:

mkdir /tmp/targetdir
cd sourcedir
find . -type f -name '*.zip' -exec cp -p --parents {} /tmp/targetdir ";"
find . -type f -name '*.txt' -exec cp -p --parents {} /tmp/targetdir ";"

Ähnlich wie Paulius' Lösung, aber die Dateien, die Sie kümmern sich nicht kopiert zu werden dann nicht gelöscht:

@echo OFF

:: Replace c:\temp with the directory where folder1 resides.
cd c:\temp

:: You can make this more generic by passing in args for the source and destination folders.
for /f "usebackq" %%I in (`dir /b /s /a:-d folder1`) do @echo %%~nxI | find /V "data.zip" | find /v "info.txt" >> exclude_list.txt
xcopy folder1 copy_of_folder1 /EXCLUDE:exclude_list.txt /E /I

Das ist nur zwei einfache Befehle, aber ich würde nicht empfehlen, es sei denn, die Dateien, die Sie nicht brauchen, klein zu kopieren. Das ist, weil diese alle Dateien kopiert und dann die Dateien entfernen, die nicht in der Kopie benötigt werden.

xcopy /E /I folder1 copy_of_folder1
for /F "tokens=1 delims=" %i in ('dir /B /S /A:-D copy_of_files ^| find /V "info.txt" ^| find /V "data.zip"') do del /Q "%i"

Sicher, der zweite Befehl ist eine Art lange, aber es funktioniert!

Auch dieser Ansatz erfordert Sie nicht alle Tools von Drittanbietern zum Herunterladen und Installieren (Windows 2000+ BATCH hat genug Befehle für diese).

Unter Linux und anderen UNIX-Systemen, die tar Befehl würde dies leicht tun.

$ tar cvf /tmp/full-structure.tar *data.zip *info.txt

Dann würden Sie an das Ziel CWD und:

$ tar xvf /tmp/full-structure.tar 

Natürlich könnten Sie Rohr die Ausgabe von dem ersten Teer in die zweiten, aber da es in den Schritten arbeitet, ist leichter zu verstehen und zu erklären. Ich vermisse den notwendig cd / to / neu / path / in dem folgenden Befehl - ich weiß nicht nur daran erinnern, wie es jetzt zu tun. Jemand anderes kann es hinzufügen, hoffnungsvoll.

$ tar cvf -  *data.zip *info.txt |  tar xvf - 

Tar (gnutar) auch auf Windows verfügbar ist, aber ich würde wahrscheinlich die xcopy Methode selbst auf dieser Plattform verwendet werden.

XCOPY /S folder1\data.zip copy_of_folder1  
XCOPY /S folder1\info.txt copy_of_folder1

EDIT:. Wenn Sie die leeren Ordner erhalten wollen (die Ihren Beitrag auf rereading, Sie scheinen) verwenden / E anstelle von / S

Mit WinRAR Befehlszeilenschnittstelle können Sie die Dateinamen und / oder Dateitypen in ein Archiv kopiert werden. Dann können Sie das Archiv extrahieren, was auch immer Position, die Sie mögen. Dies bewahrt die ursprüngliche Dateistruktur.

Ich brauchte fehlende Alben Bilddateien auf mein Handy hinzuzufügen, ohne die Musik selbst erneut zu kopieren zu müssen. Zum Glück war die Verzeichnisstruktur das gleiche auf meinem Computer und Handy!

I verwendet:

   rar a -r C:\Downloads\music.rar X:\music\Folder.jpg
  • C: \ Downloads \ music.rar = Archiv erstellt werden
  • X: \ music \ = Ordner mit Musikdateien
  • Folder.jpg = Dateiname Ich wollte kopieren

Das erstellt ein Archiv mit allen Folder.jpg Dateien in den richtigen Unterordner.

Diese Technik kann verwendet werden, Dateitypen und zu kopieren. Wenn die Dateien alle verschiedene Namen hatte, konnte man wählen, ob alle Dateien in einem Verzeichnis zu extrahieren. Zusätzliche Befehlszeilenparameter können mehrere Dateitypen archiviert werden.

Weitere Informationen in diesem sehr hilfreich Link http: // cects.com/using-the-winrar-command-line-tools-in-windows/

Für die Verwendung von Altap Salamander (2 Platten-Dateimanager): In den Optionen des Copy Popup, geben Sie einfach die Dateinamen oder Masken. Leicht.

Ich bin fein mit regulären Ausdrücken, faul und abgeneigt anbringt, so habe ich eine Batch-Datei, die das Verzeichnis und kopiert mit Vanille-DOS-Befehlen erstellt. Scheint mühsam, aber schneller für mich als Robocopy ausarbeitet.

  1. Erstellen Sie Ihre Liste der Quelldateien mit vollständigen Pfaden, einschließlich Laufwerksbuchstaben, wenn nec, in einer Textdatei.
  2. Schalten Sie reguläre Ausdrücke in Ihrem Texteditor.
  3. Fügen Sie doppelte Anführungszeichen um jede Zeile im Falle von Räumen - Suchbegriff (.*) Zeichenfolge "\1" zu ersetzen, und klicken Sie ersetzen alle
  4. Erstellen Sie zwei Zeilen pro Datei - ein das Verzeichnis zu erstellen, eine Datei zu kopieren (qqq mit Zielpfad ersetzt werden) - Suchbegriff (.*) Zeichenfolge md qqq\1\nxcopy \1 qqq\1\n ersetzen und klicken Sie ersetzen alle
  5. Entfernen Sie die Dateinamen aus den Zielpfaden - Suche \\([^\\^"]+)"\n ersetzen \\"\n
  6. Ersetzen im Zielpfad (in diesem Beispiel A:\src und B:\dest). Schalten Sie reguläre Ausdrücke, Suche qqq"A:\src\ ersetzen B:\dest\ und klicken Sie auf alle ersetzen.

md werden verschachtelte Verzeichnisse erstellen. Kopie verhalten würde wahrscheinlich identisch in diesem Beispiel xcopy. Vielleicht möchten Sie hinzufügen / Y xcopy Überschreiben bestätigt zu unterdrücken. Sie enden mit einer Batch-Datei nach oben wie folgt:

md "B:\dest\a\b\c\"
xcopy "C:\src\a\b\c\e.xyz" "B:\dest\a\b\c\e.xyz"

wiederholt für jede Datei in Ihrer ursprünglichen Liste. Getestet auf Win7.

diese per Drag zu tun und Nutzung fallen winzip eine Richt Struktur Option erhalten ist. Erstellen Sie einfach die Ihre Wurzel und ziehen Sie die Dateien in ein neues .zip auf Verzeichnisebene sein wird.

Um alle Textdateien G zu kopieren: und Verzeichnisstruktur erhalten:

xcopy *.txt /s G:
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top