Skopiuj plik i dołącz znacznik czasu

13

Mam dwa problemy ze skryptem, który kopiuje pliki i dodaje znacznik czasu do nazwy.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%T")

Powyższe dodaje Test2jako nazwę pliku, ale chcę, aby zachowała nazwę oryginalnego pliku źródłowego, który w tym przykładzie jest nazwany Test.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%r")

Innym problemem jest to, że gdy dodam %rjako kod znacznika czasu, pojawia się błąd informujący, że docelowy „PM” nie jest katalogiem. Próbuję uzyskać znacznik czasu jako 12-godzinny zegar.

Brian
źródło
Dodając AM / PM dodaj dodatkowe miejsce w nazwie pliku. Jeśli nalegasz na to, spróbuj czegoś takiego: cp -ra / home / bpacheco / Test1 "/ home / bpacheco / Test2 - $ (data +% m-% d-% y-% r)"
Romeo Ninov
2
Lubdate +"%m-%d-%y-%I:%M:%S_%p"
don_crissti

Odpowiedzi:

12

Jednym z twoich problemów jest to, że pominąłeś podwójne cudzysłowy wokół podstawiania polecenia, więc wynik datepolecenia był podzielony na spacje. Zobacz Dlaczego mój skrypt powłoki dusi się na białych znakach lub innych znakach specjalnych? To jest poprawne polecenie:

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%m-%d-%y-%r")"

Jeśli chcesz dołączyć do oryginalnej nazwy pliku, musisz mieć ją w zmiennej.

source=/home/bpacheco/Test1
cp -a -- "$source" "$source-$(date +"%m-%d-%y-%r")"

Jeśli używasz bash, możesz zamiast tego użyć rozwinięcia nawiasu klamrowego.

cp -a /home/bpacheco/Test1{,"-$(date +"%m-%d-%y-%r")"}

Jeśli chcesz skopiować plik do innego katalogu i dołączyć znacznik czasu do oryginalnej nazwy pliku, możesz to zrobić w ten sposób - ${source##*/} rozwija się do wartości sourcebez części do ostatniej /(usuwa najdłuższy przedrostek pasujący do wzorca */):

source=/home/bpacheco/Test1
cp -a -- "$source" "/destination/directory/${source##*/}-$(date +"%m-%d-%y-%r")"

Jeśli Test1jest katalogiem, jest rekurencyjnie kopiowany, a pliki wewnątrz katalogu zachowują swoją nazwę: tylko katalog najwyższego poziomu dołącza znacznik czasu (np. Test1/fooJest kopiowany Test1-05-10-15-07:19:42 PM). Jeśli chcesz dołączyć znacznik czasu do wszystkich nazw plików, to inny problem.

Wybór formatu znacznika czasu jest złym pomysłem: jest trudny do odczytania dla ludzi i trudny do sortowania. Powinieneś użyć formatu, który jest łatwiejszy do odczytania i który można łatwo sortować, tj. Z częściami w malejącym porządku ważności: rok, miesiąc, dzień, godzina, minuta, sekunda oraz z oddzieleniem części daty i części czasu.

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y%m%d-%H%M%S")"
cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y-%m-%dT%H%M%S%:z")"
Gilles „SO- przestań być zły”
źródło
Gilles, pierwsze polecenie nie będzie działać IMHO, sprawdź pozycje podwójnych cudzysłowów. I zobacz mój komentarz do pytania
Romeo Ninov
@RomeoNinov Co jest złego w pierwszym poleceniu? Uruchomiłeś go i pojawił się błąd?
Gilles „SO- przestań być zły”
Masz rację, polecenie daty jest wykonywane w podpowłoce
Romeo Ninov
Gilles, korzystając z powyższego przykładu, jak skopiować plik z wyżej wymienionymi informacjami o znacznikach czasu do innego katalogu. Następujące polecenie nie działa:cp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2
Brian
@Brian Nie jestem pewien, czy zrozumiałem twój komentarz, ale zobacz moją edycję.
Gilles „SO- przestań być zły”