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 Test2
jako 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 %r
jako kod znacznika czasu, pojawia się błąd informujący, że docelowy „PM” nie jest katalogiem. Próbuję uzyskać znacznik czasu jako 12-godzinny zegar.
date +"%m-%d-%y-%I:%M:%S_%p"
Odpowiedzi:
Jednym z twoich problemów jest to, że pominąłeś podwójne cudzysłowy wokół podstawiania polecenia, więc wynik
date
polecenia 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:Jeśli chcesz dołączyć do oryginalnej nazwy pliku, musisz mieć ją w zmiennej.
Jeśli używasz bash, możesz zamiast tego użyć rozwinięcia nawiasu klamrowego.
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ścisource
bez części do ostatniej/
(usuwa najdłuższy przedrostek pasujący do wzorca*/
):Jeśli
Test1
jest katalogiem, jest rekurencyjnie kopiowany, a pliki wewnątrz katalogu zachowują swoją nazwę: tylko katalog najwyższego poziomu dołącza znacznik czasu (np.Test1/foo
Jest kopiowanyTest1-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.
źródło
cp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2