Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam... mam taki problem...
potrzebuję stworzyć skrypt w bashu który będzie przenosił pliki z jednego miejsca w drugi...z czego w drugim miejscu
wcześniej stworzy katalog z datą pobraną z nazwy pliku....lub jeśli folder już istnieje to wrzuci do niego te pliki.
Przykładowo:
źródło:
/pliki/folder/NAZWA1.2021-02-01.dum.gz
/pliki/folder/NAZWA1.2021-02-02.dum.gz
/pliki/folder/NAZWA1.2021-02-03.dum.gz
/pliki/folder/NAZWA2.2021-02-01.dum.gz
/pliki/folder/NAZWA2.2021-02-02.dum.gz
/pliki/folder/NAZWA2.2021-02-03.dum.gz
docelowo skrypt miałby przenosić pliki do:
/docelowy/folder/NAZWA1/2020-02/
/docelowy/folder/NAZWA2/2020-02/
czyli np stworzy w /docelowy/folder/NAZWA1 katalog z datą ( tylko rok i miesiąc ) i tam będzie wrzucał codziennie nowe pliki
osobno dla NAZWA1 i NAZWA2.
kwestia jest jeszcze taka...że jeśli miesiąc wskoczy na marzec ( pojawią się pliki marcowe )
to utworzy ten katalog z datą i tam będzie wrzucał pliki marcowe.
Ma ktoś może pomysł na to? Pozdrówki
Offline
Jeśli poszczególne człony nazwy pliku mają stałe długości to można np. tak wyłuskać dane do tworzenia katalogów.
nazwa=NAZWA1.2021-02-01.dum.gz;folder1=${nazwa:0:6};folder2=${nazwa:7:10};echo $folder1;echo $folder2 NAZWA1 2021-02-01
A jak człony mają zmienne długości to np. tak:
echo NAZWA1.2021-02-01.dum.gz | awk -F'[.]' '{ print $1, $2 }' NAZWA1 2021-02-01
Ostatnio edytowany przez arecki (2021-02-02 11:30:31)
Offline
#!/bin/bash zro="/pliki/folder" doc="/docelowy/folder" for plik in "$zro"/*; do nazwa="$(basename "$plik" | awk -F '.' '{print $1}')" data="$(basename "$plik" | awk -F '.' '{print $2}' | sed -r 's/-[0-9]+$//g')" mkdir -p "$doc/$nazwa/$data" mv "$plik" "$doc/$nazwa/$data" done
Offline
Dzięki wielkie Panowie za pomoc :D
Wszystko gra i buczy :) ogólnie to całą akcję załatwił skrypt megabajta :)
rozgryzam jeszcze sekcję awk -F '.' '{print $2}' | sed -r 's/-[0-9]+$//g') a właściwie sed'a w jaki sposób ogarnia ten wycinek
Offline
sed w tym przypadku pracuje nad ciągiem znaków np. '2021-02-01'. Regex jest zakotwiczony na końcu (znak specjalny $), więc próbuje się dopasować do
-[jedna lub więcej cyfr][koniec ciągu]
W tym przypadku jedyne dopasowanie to
-01
sed w takiej chyba najczęściej stosowanej postaci ma składnię:
sed 's/SZUKANY_REGEX/NA_CO_ZAMIENIĆ/g'
W przykładzie megabajta sekcja NA_CO_ZAMIENIĆ jest pusta, więc sed wyszukuje i kasuje ten regex. Czyli po polsku - sed wyszukuje ostatnią w ciągu znaków liczbę, o ile jest poprzedzona znakiem '-' i ją kasuje.
Offline
zamiast:
sed -r 's/-[0-9]+$//g'
można też użyć:
awk -F '-' '{print $1"-"$2}'
Offline
albo
cut -d '-' -f 1-2
Offline
Strony: 1