Skopiowałem jakiś plik z folderu źródłowego do folderu docelowego za pomocą poniższego wiersza poleceń w terminalu.
sudo cp From_SOURCE/* To_DESTINATION/
Teraz chcę cofnąć to polecenie.
command-line
cp
αғsнιη
źródło
źródło
From_SOURCE/*
i usunąć jeTo_DESTINATION/
; można to zrobić za pomocą bash - tutaj problemy mogą polegać na tym, że polecenie cp nadpisało wszystko, dowiązania symboliczne zostały skopiowane, pliki ze spacjami w nazwach itp. - więc mogło to mieć problemy i nieco zwariowane. Idealna opcja „cofnij” mogłaby uwzględniać wiele rzeczy.Odpowiedzi:
Jeśli dobrze rozumiem, dzieje się tak:
Poniższy skrypt wyszukuje w oryginalnym katalogu (źródłowym) i wyświetla te pliki. Następnie przegląda katalog, do którego skopiowano pliki, i usuwa tylko wymienione pliki, ponieważ istnieją one w katalogu źródłowym.
try
Element jest dodawany, aby zapobiec błędom, na przykład w przypadku mogłeś usunięto niektóre pliki ręcznie już, lub jeśli nie wszystkie pliki z katalogu źródłowego zostały skopiowane do miejsca przeznaczenia. Jeśli potrzebujesz uprawnień sudo, po prostu uruchom skrypt z „sudo” (patrz poniżej).Scenariusz
Jak używać
reverse.py
,Uruchom go za pomocą polecenia:
Ostrzeżenie
Najpierw wypróbuj katalog testowy, jeśli dobrze rozumiem, co musisz osiągnąć!
Jeśli katalog jest „płaski”
W przypadku, gdy katalog źródłowy nie ma podkatalogów, skrypt może być jeszcze prostszy:
Uwaga
Jeśli akcja kopia nadpisałeś (zastąpiony) plik o podobnej nazwie w okolicy, plik zostanie usunięty, ale oryginalny plik (oczywiście) nie może być sprowadzony przez skrypt. Zakłada się, że nie ma konfliktów nazw.
źródło
sudo python3 reverse.py
. Przyjmuję twoją odpowiedź.cp
.cp -r
. Zmieniłem zaos.remove
pomocąprint
, i wyprowadza kilka plików, które nie istnieją. Zakładam, że brakuje podkatalogów i tylko listy plików na końcu.TL; DR:
Wszystkie pliki, które są obecne w obu
src
idest
można je usunąć wdest
następujący sposób:Aby uzyskać wyjaśnienie krok po kroku, patrz poniżej.
Uproszczenie problemu:
Aby zrozumieć, co właściwie zrobiliśmy polecenie, zaczynamy od uproszczenia:
Polecenie, które chcemy cofnąć, to
Dla zrozumienia, jak cofnąć,
sudo
nie ma znaczenia.Użyję nazw katalogów
src
dlaFrom_SOURCE
idest
dlaTo_DESTINATION
.Teraz naszym poleceniem jest:
Jeśli
src
zawiera plikif1
,f2
af3
, a katalogid1
id2
, powłoka rozszerza tę komendę:Bez opcji podoba
-r
,-R
czy-a
komendacp
nie kopiuje katalogów.Oznacza to, że polecenie je pominie, pokazując błąd dla każdego z nich:
Oznacza to, że skopiowaliśmy tylko proste pliki, a nie katalogi
dest
.Decydowanie, które pliki usunąć:
Możliwe, że były pliki
dest
o tej samej nazwie co plikisrc
. W tym przypadku pliki zostały nadpisane (1). Przepraszam, jest już dla nich za późno. Odzyskaj je z najnowszej kopii zapasowej.Jeśli chodzi o pliki, które tam są, chcemy usunąć tylko pliki, które zostały skopiowane. Pliki te istnieją w obu katalogach, o tej samej nazwie i tej samej zawartości.
Szukamy więc tych plików:
Po pierwsze, wchodzimy
cd
w tosrc
, ponieważfind
znacznie upraszcza następujące polecenia i ustawia zmienną na absolutną ścieżkę dest:Następnie wyświetlamy wszystkie pliki w src:
i dla każdego znalezionego pliku użyj,
cmp
aby sprawdzić, czy w dest jest plik o tej samej zawartości:Usuwając pliki, ostrożnie:
Te pliki chcemy usunąć. Ale dla pewności najpierw przenosimy je do innego katalogu - i uruchamiamy polecenia przed ich uruchomieniem:
Wygląda dobrze! Teraz możemy pominąć
echo
uruchamianie prawdziwychmv
poleceń:Wszystkie pliki z
dest
tego zostały skopiowanesrc
i nadal są takie same wsrc
idest
są teraz w/tmp/toDelete/
i można je usunąć po ostatnim spojrzeniu.Uwagi:
(1) Sprawdź, czy
cp
jest to alias do, czy coścp -i
takiego, aby zapobiec zastąpieniu plików, pytając najpierw.źródło
To jest stare, ale chciałem tylko napisać czystą odpowiedź:
Najpierw przejdź do katalogu, w którym skopiowano pliki.
cd dest
Następnie
ls
katalog źródłowy i potokuj dane wyjściowerm
ls source | xargs rm
źródło
ls
jest zazwyczaj złym pomysłem. mywiki.wooledge.org/ParsingLs Nie będę głosować za twoim postem, ale należy to zauważyć.rm `ls`
—dla pustego wcześniej folderu i gdy pliki mają nazwy bez spacji i znaków nowej linii.