Jeśli nie masz tar
z --transform
Może to prace:
TRG=/target/some/where
SRC=/my/source/dir
cd "$SRC"
find . -type f -name \*.\* -printf "mkdir -p '$TRG/%h' && cp '%p' '$TRG/%p'\n" |\
sed 's:/\.::;s:/./:/:' |\
xargs -I% sh -c "%"
Brak spacji po \
potrzebują prostego końca linii, czy można dołączyć go do jednej linii jak:
find . -type f -name \*.\* -printf "mkdir -p '$TRG/%h' && cp '%p' '$TRG/%p'\n" | sed 's:/\.::;s:/./:/:' | xargs -I% sh -c "%"
Objaśnienie:
find
znajdzie wszystkie zwykłe pliki co mają rozszerzenia w was SRC (źródło) katalog
- Znalezisko za
printf
przygotuje potrzebne poleceń powłoki:
- polecenia do tworzenia potrzebnego drzewa katalogów w TRG (target reż)
- polecenie kopiowania
- z
sed
jakiejś kosmetycznej czyszczenia ścieżki (jak sprostowanie /some/path/./other/dir)
xargs
zajmie całą linię
- i wykonać przygotowane poleceń z powłoką
Ale to będzie dużo lepiej:
- prostu dokonać dokładnie kopię w 1 kroku
- zmiana nazwy plików w drugim kroku
łatwiejsze, czystsze i SZYBCIEJ (nie potrzeba c hecking/tworzenie docelowych podkatalogów)!
jakie powinno być zachowanie, jeśli istnieją dwa pliki (na przykład 1.txt i 1.jpg) w tym samym katalogu, które mają taką samą nazwę oprócz rozszerzenia? –
wszystkie nazwy plików są poprzedzone unikalnym identyfikatorem, więc nie ma ryzyka nazwania kolizji. – user1345178