Próbuję dołączyć bieżącą datę na końcu nazwy pliku w następujący sposób:
TheFile.log.2012-02-11
Oto co mam do tej pory:
set today = 'date +%Y'
mkdir -p The_Logs &
find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; &
Jednak dostaję tylko nazwę pliku i nic nie dodaje. Jak dodać aktualną datę do nazwy pliku?
:
ponieważ wtedy będzie ona czytana jako host w rsync i scp. stackoverflow.com/a/37143274/390066Odpowiedzi:
Bardziej niż prawdopodobne jest to twoje wykorzystanie
set
. Spowoduje to przypisanie „dzisiaj”, „=” i wynikudate
programu do parametrów pozycyjnych (czyli argumentów wiersza poleceń). Chcesz po prostu użyć powłoki C (która oznacza to jako „bash”, więc prawdopodobnie nie), będziesz chciał użyć:Zwróć uwagę na brak spacji wokół znaku równości.
Nie chcesz również używać
&
na końcu swoich wyciągów; co powoduje, że powłoka nie czeka na zakończenie polecenia. Zwłaszcza, gdy ktoś polega na drugim.find
Komenda może nie dlatego, że jest uruchomiony przedmkdir
.źródło
Skrypt Bash, aby wstawić datę do nazwy pliku:
Ten kod bash w pliku o nazwie
a.sh
Po uruchomieniu drukuje:
Objaśnienie kodu:
Interpretuj skrypt za pomocą interpretera / bin / bash. Utwórz nową zmienną o nazwie dzisiaj. Wykonaj polecenie date, przekazując flagi Y, m, d, H, M, S, aby skonfigurować dane wyjściowe. Umieść wynik w zmiennej daty.
Utwórz nową zmienną o nazwie nazwa_pliku, otaczaj zmienną $ Today resztą tekstu statycznej nazwy pliku. następnie powtórz nazwę pliku na ekranie.
Wciśnij go w linijkę, aby zwiększyć lulz:
źródło
Wygląda na to, że pomieszałeś kilka rzeczy.
set today = 'date +%Y'
wygląda na składnię tcsh, ale nawet w tcsh przypisuje ciągdate +%Y
do zmiennejtoday
, nie uruchamiadate
polecenia. Ponieważ prawdopodobnie używasz bash lub innej powłoki POSIX, składnia przypisania jest następującatoday=some_value
(bez spacji wokół znaku równości). Aby uruchomić polecenie i przypisać dane wyjściowe do zmiennej, użyj podstawienia polecenia :(Skończyłem także specyfikację daty). Możesz używać cudzysłowów zamiast nawiasów dolarowych, ale jest podatny na mylące wizualnie z cudzysłowami do przodu, a zasady, kiedy potrzebujesz cudzysłowów wewnątrz polecenia z cudzysłowem, są dość złożone i zależą od implementacji, więc lepiej nie trzymać się
$(…)
( ma taki sam efekt ze składnią sanera).Użyłeś
&
na końcu kilku poleceń. To powoduje, że polecenie wykonuje się w tle, co nie jest tutaj potrzebne. Podejrzewam, że miałeś na myśli&&
, co oznacza wykonanie następnego polecenia tylko wtedy, gdy pierwsze polecenie się powiedzie.Alternatywą do używania
&&
po każdym poleceniu jest uruchomienie skryptuset -e
. To mówi powłoce, aby przestała wykonywać skrypt, gdy tylko dowolne polecenie zwróci niezerowy status (z wyjątkiem poleceń wif
warunkach i kilku innych przypadkach).Twoje
find
polecenie jest w porządku, ale prawdopodobnie nie robi tego, co zamierzasz (chociaż nie wiem na pewno, co to jest).Tworzysz katalog za pomocą,
mkdir
a następnie od razu go przeglądaszfind
. To nie będzie przydatne, dopóki katalog już nie istnieje. Czy chodziło Ci o utworzenie katalogu dla dzisiejszych dzienników i przeniesienie ostatnich plikówThe_Logs
do katalogu o nazwie np.The_Logs.2012-02-11
?A może chciałeś zmienić nazwę dzisiejszych plików dziennika, aby dodać przyrostek
$today
? Wymaga to obliczenia innej nazwy pliku dla każdego pliku do przeniesienia.Zauważ, że użyłem
-mtime
, aby przenieść pliki na podstawie ich czasu modyfikacji, a nie-atime
, czyli czasu ostatniego odczytu pliku (jeśli twój system to śledzi - jeśli nie, atime może być tak daleko jak mtime).źródło
Możesz zmienić nazwę pliku z dołączonym znacznikiem czasu
źródło
To:
powinno działać. Chociaż wydaje się, że używasz csh, a moje rozwiązanie polegające na usunięciu znaku + może nie działać, ale nie zaszkodzi spróbować. Umieszczenie zmiennej w nawiasach klamrowych {{} zawsze jest dobrym pomysłem, aby zapobiec nieoczekiwanemu rozwinięciu zmiennej.
źródło