Jak mogę przenieść pliki do katalogu, w którym mogą znajdować się setki lub tysiące plików, a Ty możesz nie być pewien, czy są w nim duplikaty ..
. Jakiej metody byś użył?
Sposób obsługi duplikatów będzie się różnił, czasem nadpisujemy, czasem musimy być bezpieczniejsi. IO może być ważne, ponieważ są to serwery produkcyjne. Ale biorąc pod uwagę ilość monitów o niepubliczne pliki, nie jest opcją. Ważne jest zachowanie uprawnień, znaczników czasu itp. Zwykle nie wiemy, jakie są dane.
No i korzystanie z niego mv
nie jest wymagane rsync
, cp
rozwiązania mile widziane.
Uwaga: korzystamy z CentOS 5.5, więc daj mi znać, jeśli to nie zadziała, ponieważ jest to nowsza ... funkcja
command-line
rename
ksenoterracid
źródło
źródło
mv
czy zależy nam na zachowaniu w przypadku ... i czy już zrobiliśmy kopię zapasową. To pytanie jest dość otwarte. Po prostu szukam dobrych opcji, a może komentarza na temat tego, czy może cię ugryźć i jak.mv * ../
lubmv -i * ../
?Odpowiedzi:
Polecam użycie rsync od rodzica:
który utworzy kopię zapasową wszystkich istniejących duplikatów plików nadrzędnych do oryginalnych plików .
źródło
-a
implikuje-r
-l
dlacp
)-H
lub--hard-links
dla rsync, aby zachować twarde linki.--link-dest=DIR
flagi, aby osiągnąć to zachowanie jako:rsync -avP --link-dest=/path/to/src /path/to/src/* /path/to/dest/
która będzie dowiązać do dst / dowolnych niezmienionych plików między src i src, w tym przypadku wszystkich plików. Zwykle ta flaga jest używana, gdy chcesz ponownie połączyć pliki kopii zapasowych bez kopiowania ich danych, takich jak--link-dest=/most/recent/backup
.Spowoduje to skopiowanie wszystkiego z bieżącego katalogu do katalogu nad nim, zachowując wszystkie uprawnienia, używając dowiązań twardych, aby zminimalizować IO, jeśli to możliwe, a na duplikatach tworzy nazwę pliku ~
po tym
źródło
W tym przykładzie pliki zostaną przeniesione z „/ parent / old-dir” do „/ parent”:
Według reguł rsync zastąpi dups nowszymi plikami z
old-dir
.źródło
Możesz spróbować
co spowoduje zastąpienie duplikatów w…
Możesz użyć mv -u '{}', aby nie zastępować, jeśli dupe w .. jest taki sam lub nowszy
źródło
..
domv '{}' +
polecenia, ponieważ + dodaje tylko do końca.-exec mv -t .. -- {} +
. Przenośnie:-exec sh -c 'mv -- "$@"' _ {} +
.mv -i
pyta tylko, czy miejsce docelowe istnieje.yes n | mv -i …
przenosi wszystkie pliki, które nie istnieją w katalogu docelowym. W FreeBSD i OSX możesz to skrócićmv -n …
.Zauważ, że żaden z nich nie połączy argumentu katalogu z istniejącym katalogiem o tej samej nazwie w katalogu docelowym.
Osobnym problemem jest sposób działania na wszystkie pliki w bieżącym katalogu. Istnieją dwa problemy: pobieranie wszystkich plików (
*
pomija pliki kropkowe) i nie uruchamianie się w wierszu poleceń. W systemie Linux (lub bardziej ogólnie z GNU find i coreutils GNU):Z GNU znajdź, ale nie jądra GNU (lub starsze jądra GNU):
Przenośny:
Jak zwykle zsh ułatwia. Nie ma wewnętrznego ograniczenia długości wiersza poleceń, więc jeśli używasz jego
mv
wbudowanego programu, nie musisz się tym martwić. Możesz powiedzieć, aby nie ignorować plików kropek za pomocąD
kwalifikatora glob. Ograniczenie: to nie działa w różnych systemach plików (od zsh 4.3.10).źródło
Powiedziałem o naszym ML
oczywiście nie jest to zbyt bezpieczne ... nadpisze rzeczy. Może mieć ograniczenia, których nigdy nie spotkałem.
źródło
-
. Nie złapie plików, których nazwa zaczyna się od.
.Poniżej znajduje się szablon Pythona, z którego korzystałem w przeszłości.
źródło