Mam skrypt bash do wdrażania kodu ze środowiska beta do środowiska produkcyjnego, ale obecnie muszę ręcznie dodać listę plików do pliku txt, a czasem brakuje. Zasadniczo mój skrypt instalacyjny cat / pętle kopiuje pliki. (eksportuje / importuje również db, ale to nie dotyczy .. lol)
W każdym razie chciałbym użyć find
polecenia do wygenerowania listy plików zmodyfikowanych w ciągu ostatnich 14 dni. Problem polega na tym, że muszę usunąć ścieżkę, ./
aby skrypt wdrażania działał.
Oto przykład użycia polecenia find:
odnaleźć . -type f -mtime -14> deploy.txt
Oto wiersz, który koty deploy.txt
w moim skrypcie wdrażania:
for i in `cat deploy.txt`; do cp -i /home/user/beta/public_html/$i /home/user/public_html/$i; done
Masz pomysł, jak to osiągnąć za pomocą skryptów bash?
Dzięki!
--dry-run
trybie i wyślij go do pliku w celu przejrzenia?Odpowiedzi:
Możesz użyć
-printf
opcji wiersza polecenia,%f
aby wydrukować tylko nazwę pliku bez żadnych informacji katalogowychlub możesz użyć sed, aby usunąć ./
źródło
/.
.|
jako separatora.%f
spowoduje usunięcie wszystkich katalogów, nie tylko./
. Spowoduje to uszkodzenie jego skryptu wdrażania, jeśli którykolwiek z zwracanych plikówfind
znajdzie się w podkatalogach..
. A może najlepiej użyć kotwicy początkowej:s|^\./||
%P
zamiast%f
. To po prostu odcięło ścieżkę podaną w wierszu poleceń../
Powinny być nieszkodliwe. Większość programów będzie traktować/foo/bar
i/foo/./bar
jako równoważne. Zdaję sobie sprawę, że nie wygląda to zbyt ładnie, ale na podstawie tego, co opublikowałeś, nie widzę powodu, dla którego miałby spowodować awarię skryptu.Jeśli naprawdę chcesz go zdjąć,
sed
to prawdopodobnie najczystszy sposób:Jeśli korzystasz z systemu z GNU find (np. Większość systemów Linux), możesz to zrobić jednym strzałem
find -printf
:Te
%P
powroty pełna ścieżka każdego pliku znaleziony, minus ścieżka podana w wierszu poleceń, włącznie pierwszy ukośnik. Pozwoli to zachować wszystkie podkatalogi w strukturze katalogów.źródło
./
Prefiks jest właściwie cechą; bez niego przesyłanie danych wyjściowych do innych poleceń nie będzie działać poprawnie, np. w przypadku nazw plików rozpoczynających się od myślnika.Dlaczego musisz się rozebrać
./
? Ważne jest, aby mieć na ścieżce. Więcjest w porządku!
Ale jeśli chcesz usunąć nazwę katalogu w find, możesz użyć
%P
argumentu do-printf
.man find (1) mówi:
Przykład
Uważaj na pierwszą pustą linię! Jeśli chcesz tego uniknąć, użyj
-mindepth 1
źródło
Masz kilka opcji. Możesz użyć
-printf
opcji znajdowania, aby wydrukować tylko nazwę pliku, lub możesz użyć narzędzia takiego jak sed, aby po prostu usunąć plik./
.źródło
Rozwiązanie „find -printf” nie będzie działać na FreeBSD, ponieważ find nie ma takiej opcji. W takim przypadku AWK może pomóc. Zwraca nazwisko ($ NF), dzięki czemu może pracować na dowolnej głębokości.
PS: zaczerpnięte z książki D.Tansleya „Programowanie powłoki Linuksa i Uniksa”
źródło
Szybkim rozwiązaniem, jeśli dobrze rozumiem pytanie, jest użycie
cut
danych wyjściowychfind
polecenia:Spowoduje to usunięcie pierwszych znaków z każdej linii wyniku (w twoim przypadku
./
). Prawdopodobnie nie najlepsze rozwiązanie, ale działa w twoim scenariuszu.źródło
sed
jest idealny do tego rodzaju rzeczy.źródło
Nie wiem, o jakich nazwach plików mówimy, ale cokolwiek ze spacjami lub znakami nowej linii naraża większość rozwiązań tutaj.
Moją sugestią byłoby użycie rozszerzenia parametrów powłoki do usuwania znaków z każdej nazwy pliku:
Jeśli naprawdę lubisz potoki, możesz użyć „bezpiecznego” separatora, np. Null, z xargs do otrzymania każdej nazwy pliku:
Pamiętaj, że wynik tego NIE jest rozdzielany wartością zerową, więc chociaż może być wystarczający do sprawdzenia gałki ocznej, żadne z tych rozwiązań nie tworzy pliku deploy.txt, który można bezpiecznie wykorzystać do automatyzacji, chyba że masz pewność co do źródła nazwy plików.
źródło