Jak sprawdzić, które pliki zostaną skopiowane za pomocą polecenia cp?

11

Tworzę prosty skrypt, który kopiuje wszystkie pliki z DIRECTORYA, które nie istnieją w DIRECTORYB. Robię to za pomocą polecenia cp:

cp -u DIRECTORYA/* DIRECTORYB

Chciałbym również wysłać wiadomość e-mail do administratora, który wyświetli listę skopiowanych plików.

Idealnie więc, zanim uruchomię powyższe polecenie, chciałbym pobrać pliki, które zostaną skopiowane i przechowywać je w zmiennej do późniejszego wykorzystania podczas tworzenia mojej wiadomości e-mail.

Czy ktoś może skierować mnie we właściwym kierunku? Sprawdziłem użycie grep, ale nie sądzę, że można to zrobić za pomocą polecenia cp?

James
źródło
1
Może nie rozumiem twojego pytania, ale czy nie możesz użyć -vflagi, aby wydrukować nazwy plików podczas ich kopiowania? Przekieruj to do pliku lub bezpośrednio w zmiennej i użyj go do zbudowania wiadomości.
ThibautRenaux
Dodatkowo cppolecenie ma opcję --attributes-onlypozwalającą nie kopiować danych plików, a jedynie strukturę katalogów i plików.
Costas
Przepraszam, jestem dość nowy w skryptowaniu. Jeśli użyję flagi -v, jak mogę wyprowadzać dane do zmiennej zamiast do pliku?
James
1
Zakładając, że używasz bash, variable=$(cp -v ...)przechwytuje stdout cp. Zobacz gnu.org/software/bash/manual/html_node/Command-Substitution.htm
Gowtham

Odpowiedzi:

4

Nie sądzę, że GNU cpma ci coś do pomocy, jeśli chcesz zobaczyć, co by zrobił bez działania. Jeśli chcesz zalogować zmodyfikowane pliki, możesz użyć -vopcji:

cp -puv DIRECTORYA/* DIRECTORYB >copy.log

Zamiast tego cpmożesz użyć programu rsync , który jest o wiele potężniejszy i instalowany prawie wszędzie, z wyjątkiem systemów wbudowanych niskiej klasy (i łatwy do zainstalowania tam, gdzie domyślnie nie jest obecny).

rsync -aun DIRECTORYA/* DIRECTORYB >what-would-be-done.txt

lub

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log
Gilles „SO- przestań być zły”
źródło
3

Według strony podręcznika ,

-u, kopiuj tylko wtedy, gdy plik SOURCE jest nowszy niż plik docelowy lub gdy brakuje pliku docelowego--update

jest to funkcja, która łączy dwa testy, jeden trywialny do zaimplementowania w skrypcie ( brak ) i drugi wymagający pracy ( nowszy ). Możesz utworzyć skrypt, który zgłasza, co jest potrzebne comm, diffi test.

Żaden ze standardowych cpnarzędzi zapewniają możliwość sucho operacji kopiowania. Jak sugerowano, rsyncjest to sposób na wykonanie tego za pomocą powszechnie dostępnego narzędzia. Oczywiście rsynczwykle służy do kopiowania na podstawie większej liczby kryteriów niż tylko nowszych lub brakujących (stosuje się również rozmiar pliku i znaczniki czasu). Ale można to sprowadzić do robienia sprawiedliwego cp -u.

W przypadku niestandardowych narzędzi istnieje copynarzędzie, które napisałem (i oczywiście nadal używam) pod koniec lat osiemdziesiątych. Prawdopodobnie został zainspirowany makenarzędziem, ponieważ pierwszą opcją, którą dodałem, było -n.

W podanym przykładzie byłby on użyty w następujący sposób:

$ copy -nvU DIRECTORYA/* DIRECTORYB
** copy DIRECTORYA/foo to DIRECTORYB/foo
** 1 file would be copied, 616 bytes

Dalsza lektura:

  • copy - narzędzie do kopiowania plików / katalogów

    -n wyłącza faktyczne tworzenie lub modyfikowanie plików i (w zależności od poziomu szczegółowości) pokazuje efekt, jaki copy miałoby polecenie.
    -u kopiuje pliki tylko wtedy, gdy różni się ich rozmiar lub data modyfikacji, a łącza tylko, jeśli tekst łącza różni się.
    -U kopiuje tylko pliki, które są nowsze niż miejsce docelowe lub nie istnieją w miejscu docelowym.

  • wpis dziennika zmian od sierpnia 1988 r . :

    1988-08-16    
            * src / copy / src / copy.c: dodano opcje „-d” i „-n”.
    
Thomas Dickey
źródło
2

Jeśli chcesz uruchomić cp foo*bar whatever, uruchom echo foo*bar whateverzamiast tego.

VaTo
źródło
1
Ale OP chce biec cp -ui szuka opcji podobnej do cp.
Arkadiusz Drabczyk
0

Możesz użyć polecenia diff. Mam zadanie, które codziennie kopiuje niektóre pliki kopii zapasowych. kiedyś muszę sprawdzić, czy wszystkie pliki są skopiowane, oto składnia:

diff /file1/ /file2/

i oczywiście, jeśli chcesz je skopiować, użyj:

cp -u /file1/* /file2
poori
źródło
0

Zamiast tego rozważ użycie rsync. Rsync działa doskonale na lokalnych kopiach i na pewno może robić, co chcesz, gdy przejdziesz przez piętnaście dostępnych opcji gazillionu.

rsync -avun DIRECTORYA/ DIRECTORYB

pokaże ci wszystko, co można zrobić, i

rsync -avu DIRECTORYA/ DIRECTORYB

zrobię to.

Edward Falk
źródło