Mam dwa drzewa katalogów o podobnych układach, tj
.
|-- dir1
| |-- a
| | |-- file1.txt
| | `-- file2.txt
| |-- b
| | `-- file3.txt
| `-- c
| `-- file4.txt
`-- dir2
|-- a
| |-- file5.txt
| `-- file6.txt
|-- b
| |-- file7.txt
| `-- file8.txt
`-- c
|-- file10.txt
`-- file9.txt
Chciałbym scalić drzewa katalogów dir1 i dir2, aby utworzyć:
merged/
|-- a
| |-- file1.txt
| |-- file2.txt
| |-- file5.txt
| `-- file6.txt
|-- b
| |-- file3.txt
| |-- file7.txt
| `-- file8.txt
`-- c
|-- file10.txt
|-- file4.txt
`-- file9.txt
Wiem, że mogę to zrobić za pomocą polecenia „cp”, ale chcę przenieść pliki zamiast kopiować, ponieważ rzeczywiste katalogi, które chcę scalić, są naprawdę duże i zawierają wiele plików (miliony). Jeśli użyję „mv”, pojawia się błąd „Plik istnieje” z powodu sprzecznych nazw katalogów.
AKTUALIZACJA: Możesz założyć, że pomiędzy dwoma drzewami katalogów nie ma duplikatów plików.
Odpowiedzi:
Spowoduje to utworzenie linków twardych zamiast ich przenoszenia, możesz sprawdzić, czy zostały one poprawnie przeniesione, a następnie usunąć
dir1/
idir2/
.źródło
--link-dest
ścieżkę bezwzględną lub względnąmerged/
; lub skopiuje.Dziwne, że nikt nie zauważył, że
cp
ma opcję-l
:Możesz zrobić coś takiego
źródło
cp -l
nie działa ona w różnych systemach plików.cp -a
(synonim docp -RPp
), aby zachować wszystkie atrybuty plików i uniknąć następujących dowiązań symbolicznych: tutaj staje się poleceniecp -al dir1/* dir2/* merge
.Możesz do tego użyć zmiany nazwy (inaczej prename, z pakietu perla). Uwaga: nazwa niekoniecznie odnosi się do polecenia, które opisuję poza debian / ubuntu (chociaż jest to pojedynczy przenośny plik perla, jeśli go potrzebujesz).
Masz również opcję użycia vidir (z moreutils) i edycji ścieżek plików z preferowanego edytora tekstu.
źródło
Lubię rozwiązania rsync i prename , ale jeśli naprawdę chcesz zmusić mv do pracy i
-print0
i-depth
,-0
,wówczas możliwe jest obsługiwanie dużej liczby plików, które mogą mieć losowe białe spacje w swoich nazwach, wszystkie za pomocą skryptu powłoki w stylu Bourne'a:
źródło
find . -name '*.torrent' | xargs -d '\n' rm
Brutalna siła
bash
test to robi
źródło
Musiałem to zrobić kilka razy dla drzew kodu źródłowego na różnych etapach rozwoju. Moim rozwiązaniem było użycie Git w następujący sposób:
Możesz go wyrafinować za pomocą rozgałęzień i tak dalej, ale to jest ogólna idea. I mniej boisz się go upchnąć, ponieważ masz pełną migawkę każdego stanu.
źródło