
Im Anschluss an diese beiden Beiträge:
https://askubuntu.com/questions/870844/rekursiv-add-directory-name-to-file-name
Ich möchte dasselbe tun, aber mit Kopieren statt Verschieben. Ich habe also ganz einfach ein Verzeichnis mit Unterverzeichnissen und Unterunterverzeichnissen, in denen sich einige Dateien befinden. Ich möchte alle Dateien in einen anderen Zielordner kopieren, aber da einige Dateien exakte Namen haben, möchte ich den Namen der übergeordneten Verzeichnisse als Präfix an die Dateinamen anhängen.
Ich verwende Ubuntu 16.04
Antwort1
Versuchen:
find -name "*.dat" -exec bash -c 'echo cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"' tinyscript {} \;
(entfernen Sie das „Echo“, wenn die Befehle gut aussehen)
.
└── 1
└── 2
├── 3
│ └── 4
│ └── foo.dat
└── foo.dat
Erträge:
cp ./1/2/3/4/foo.dat ./1-2-3-4-foo.dat
cp ./1/2/foo.dat ./1-2-foo.dat
Grundsätzlich führen Sie cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"
für jede passende Datei ein kleines Ad-hoc-Skript ( aus, und dieses Skript generiert den Zielnamen, indem es alles /
im Quellpfad durch ein ersetzt -
. Die tinyscript
Zeichenfolge kann beliebig sein, es handelt sich lediglich um einen Namen, der im Fehlerfall als Skriptname verwendet wird.
Antwort2
Da Einfachheit der Leistung vorgezogen wird, ist dies nicht besonders effizient (da für jede Datei ein Bash-Prozess gestartet wird). Wenn Sie viele Dateien haben und/oder Zeit ein Faktor ist, ist möglicherweise eine komplexere Lösung erforderlich.
find yourdirectory/ -type f -print0 | xargs -0 -I% bash -c 'F="%" ; echo cp "${F}" "${F//\//-}"'