Kopieren und Umbenennen bei Kollision

Kopieren und Umbenennen bei Kollision

Ich möchte den Inhalt dieser Ordner mit einer Befehlszeile zusammenführen.

.
├── folder1
│   │ file.txt
├── folder2
│   │ file.txt
└───folder3
    │ file.txt

Wie kann ich das machen ?

Antwort1

Endlich kann ich dies mit cpund es ist--backupFlagge.

cp --backup=numbered */*.txt new_directory/

Antwort2

Die folgende Befehlszeilenschleife kopiert den (obersten) Inhalt jedes Ordners mit dem Namen „folder*“ in Ihrem aktuellen Verzeichnis in ein Verzeichnis mit dem Namen „new_directory“. Der /*Glob stimmt standardmäßig nicht mit „dot files“ überein; verwenden Sie, shopt -s dotglobwenn Sie dieses Verhalten ändern möchten. Wenn der gleiche (Basis-)Dateiname bereits in new_directory vorhanden ist, wird der Zieldatei der ursprüngliche Ordner (und ein Unterstrich) vorangestellt, um sie eindeutig zu machen.

Alles in einer Zeile:

for f in folder*/*; do [ ! -e "new_directory/$(basename "$f")" ] && { cp "$f" new_directory/; continue; }; [ -e "new_directory/$(basename "$f")" ] && cp "$f" "new_directory/$(dirname "$f")_$(basename "$f")"; done

Zur besseren Lesbarkeit aufgeschlüsselt:

for f in folder*/*
do 
  [ ! -e "new_directory/$(basename "$f")" ] && { cp "$f" new_directory/; continue; }
  [ -e "new_directory/$(basename "$f")" ] && cp "$f" "new_directory/$(dirname "$f")_$(basename "$f")"
done

Wenn Sie stattdessen beabsichtigen,bewegenUm die Dateien von ihren ursprünglichen Speicherorten zu entfernen, ändern Sie einfach die cp's in mv's.

verwandte Informationen