Użyj Skrótów na Macu, aby przekazać tekst do skryptu powłoki, który wybierze ostatnio zmodyfikowany plik tekstowy w jednym lokalnym folderze i dopisze do niego Twój wpis. W tym przewodniku wykorzystano tymczasowe pliki przykładowe; działanie zostaje przerwane, jeśli folder jest pusty lub najnowsze znaczniki czasu są identyczne.

Zadanie jest konkretne: dodać krótki wpis do istniejącego pliku tekstowego bez konieczności każdorazowego ręcznego wybierania tego pliku. Apple dokumentuje obsługę skryptów powłoki w Skrótach na Macu. Poniższy sposób łączy tę obsługiwaną funkcję z udokumentowanym wybieraniem plików i dopisywaniem tekstu w zsh. Poznaj Skróty dla macOS

Ustal, co oznacza „najnowszy plik”

W tym artykule „najnowszy” oznacza ostatnio zmodyfikowany. Skrypt uwzględnia tylko widoczne, zwykłe pliki, których nazwy kończą się małymi literami .txt i które znajdują się bezpośrednio w wyznaczonym folderze. Pomija podfoldery i dowiązania symboliczne. Te reguły wyboru wynikają ze wzorców nazw plików i kwalifikatorów zsh. Rozwijanie

Ta definicja ma wpływ na kolejne uruchomienia. Po dopisaniu tekstu do pliku zmienia się jego czas modyfikacji, więc zwykle pozostanie on najnowszym kwalifikującym się plikiem. Jeśli chcesz wybierać ostatnio utworzony dokument, czas modyfikacji jest inną regułą; ten sposób nie wybiera plików według daty utworzenia.

Zanim utworzysz skrót, wybierz regułę odpowiednią do swojego zadania:

Zamierzone zadanie Czy ten przykład pasuje?
Dopisanie tekstu do ostatnio edytowanego pliku .txt Tak
Dopisanie tekstu do pliku z najpóźniejszą datą w nazwie Nie; nazwy plików nie są interpretowane jako daty
Dopisanie tekstu do ostatnio utworzonego pliku Nie; czas utworzenia nie jest używany
Uwzględnienie plików w podfolderach Nie; wybór ogranicza się do jednego folderu
Dopisanie tekstu do dokumentu sformatowanego lub PDF Nie; ten przykład zapisuje zwykły tekst

Finder umożliwia przydatne sprawdzenie wizualne. Otwórz folder w widoku listy i kliknij nagłówek kolumny Data modyfikacji; w razie potrzeby kliknij ponownie, aby najnowszy element znalazł się na górze. Apple opisuje sortowanie według kolumn i odwracanie kolejności. Widok Findera pomaga sprawdzić wynik, ale skrypt sam wybiera plik. Sortowanie i porządkowanie rzeczy w Finderze na Macu

Utwórz tymczasowy folder przykładowy

Przykład wykorzystuje folder Shortcut Append Demo w katalogu domowym. Konfiguracja celowo przerywa działanie, jeśli folder o tej nazwie już istnieje, zamiast ponownie wykorzystywać jego zawartość. Tworzy dwa sztuczne pliki tekstowe z dwusekundową przerwą, dzięki czemu czas modyfikacji drugiego pliku powinien być późniejszy.

Otwórz Terminal, wklej cały poniższy blok konfiguracji i naciśnij Return. Cytowany dokument here uruchamia polecenia w osobnym procesie zsh, więc błąd konfiguracji kończy ten proces.

/bin/zsh <<'ZSH'
emulate -L zsh
setopt ERR_EXIT
folder="$HOME/Shortcut Append Demo"

if ! /bin/mkdir "$folder"; then
  printf '%s\n' 'Setup stopped: use a new folder name if this one exists.' >&2
  exit 1
fi

printf '%s\n' 'Sample entry: blue notebook.' > "$folder/older.txt"
/bin/sleep 2
printf '%s\n' 'Sample entry: green notebook.' > "$folder/newer.txt"
printf 'Example folder: %s\n' "$folder"
ZSH

Konfiguracja używa przekierowania wyjścia, aby utworzyć pliki dopiero po pomyślnym utworzeniu nowego folderu. Apple rozróżnia zwykłe przekierowanie wyjścia, które zapisuje wynik polecenia do pliku, od przekierowania dopisującego, które dodaje wynik na końcu. Przekierowywanie wejścia i wyjścia w Terminalu na Macu

Jeśli konfiguracja zgłosi, że folder już istnieje, wybierz inną tymczasową nazwę i zmień przypisanie folderu zarówno w konfiguracji, jak i w skrypcie skrótu poniżej. Nie uruchamiaj ponownie pojedynczych wierszy zapisujących pliki w istniejącym folderze.

Utwórz skrót i zachowaj tekst wejściowy

Utwórz nowy skrót w aplikacji Skróty i nadaj mu nazwę Append to Newest Text File. Wyszukaj odpowiednie czynności i dodaj je w podanej kolejności. Apple opisuje wyszukiwanie w bibliotece czynności oraz sprawdzanie za pomocą Pokaż informacje, jakie dane wejściowe przyjmuje dana czynność i jakie dane wyjściowe zwraca. Poruszanie się po liście czynności w Skrótach na Macu

  1. Dodaj czynność Tekst z przykładowym wpisem Sample entry: orange notebook.
  2. Bezpośrednio po niej dodaj czynność Uruchom skrypt powłoki.
  3. Jako powłokę wybierz /bin/zsh.
  4. Ustaw dane wejściowe skryptu na wynik poprzedniej czynności Tekst.
  5. Ustaw Przekaż dane wejściowe na jako argumenty.
  6. Zastąp zawartość pola skryptu pełnym skryptem z następnej sekcji.

Oczekiwane połączenie to jedna wartość Tekst przekazana jako jeden argument skryptu. Skrypt odczytuje ten argument jako $1. Wynikiem pomyślnego działania jest potwierdzenie tekstowe zawierające ścieżkę docelową; ta ścieżka nie jest obiektem Plik w Skrótach, a wynik nie zawiera całej treści pliku.

Pozostaw dane wejściowe połączone z wynikiem czynności Tekst. Przekazanie pliku, listy nazw plików lub niezwiązanego wejścia skrótu zmieniłoby to, co trafia do skryptu. Skrypt sprawdza liczbę argumentów, więc nieoczekiwany zbiór danych wejściowych nie zostanie dopisany jako kilka wpisów.

Jeśli skrypty są wyłączone, otwórz Skróty > Ustawienia, wybierz Zaawansowane i włącz Zezwalaj na uruchamianie skryptów. Apple opisuje te ustawienia jako sposób zezwalania na skrypty w skrótach. Instrukcje Apple dotyczące ustawień skryptów

Dodaj skrypt wybierający plik i dopisujący tekst

Wklej cały ten program do czynności Uruchom skrypt powłoki. Nie wymaga pobierania narzędzi ani tworzenia osobnego pliku skryptu. Przypisanie folderu odpowiada konfiguracji tymczasowej opisanej powyżej.

emulate -L zsh
unsetopt CLOBBER APPEND_CREATE

fail() {
  printf '%s\n' "$1" >&2
  exit 1
}

(( $# == 1 )) || fail 'Expected exactly one text input.'
[[ -n "$1" ]] || fail 'The text input is empty.'

folder="$HOME/Shortcut Append Demo"
[[ -d "$folder" ]] || fail 'The example folder does not exist.'

files=( "$folder"/*.txt(N.om) )
(( ${#files} > 0 )) || fail 'No eligible .txt files were found.'

newest="${files[1]}"

if (( ${#files} > 1 )); then
  [[ "$newest" -nt "${files[2]}" ]] ||
    fail 'The newest timestamp is tied or the folder changed. Check the files.'
fi

[[ -f "$newest" && ! -L "$newest" ]] ||
  fail 'The selected file is no longer an eligible regular file.'
[[ -w "$newest" ]] || fail 'The selected file is not writable.'

if ! printf '\n%s\n' "$1" >> "$newest"; then
  fail 'Append failed; inspect the selected file before retrying.'
fi

printf 'Appended to: %s\n' "$newest"

Wyrażenie wyboru tworzy tablicę pasujących ścieżek plików. W (N.om), N dopuszcza brak dopasowań, . ogranicza dopasowania do zwykłych plików, a om sortuje według czasu modyfikacji, umieszczając najnowszy plik na początku. Przechowywanie ścieżek w tablicy zapobiega dzieleniu nazw plików w miejscach, gdzie występują spacje. Rozwijanie

Następny test wymaga, aby pierwszy plik był ściśle nowszy od drugiego. Jeśli ich czasy modyfikacji są identyczne, skrót przerywa działanie zamiast po cichu wybierać jeden z nich. Dokumentacja zsh opisuje -nt do porównywania wieku plików, a także użyte tutaj testy na zwykły plik, dowiązanie symboliczne i możliwość zapisu. Wyrażenia warunkowe

Polecenie dopisujące używa stałego formatu printf i przekazuje wpis jako argument %s. Dzięki temu znaki procentu i ukośniki odwrotne we wpisie są traktowane jako tekst, a nie dodatkowe instrukcje formatowania. Początkowy znak nowego wiersza oddziela wpis od istniejącego tekstu, a końcowy znak nowego wiersza go zamyka. Jeśli plik już kończy się znakiem nowego wiersza, między wpisami pojawi się pusty wiersz. Wbudowane polecenia powłoki

Skrypt usuwa również ustawienia CLOBBER i APPEND_CREATE. Dokumentacja zsh podaje, że po usunięciu obu tych opcji przekierowanie dopisujące kończy się błędem, jeśli plik docelowy nie istnieje. Ma to znaczenie, gdy wybrany plik zniknie przed dopisaniem: skrypt powinien zgłosić błąd, zamiast utworzyć nowy plik pod poprzednią ścieżką. Przekierowanie

Sprawdź wynik na plikach przykładowych

Uruchom skrót raz. Jeśli przykładowy folder nie został zmieniony, oczekiwaną ścieżką docelową jest newer.txt. Otwórz ten plik i sprawdź, czy zawiera poniższy tekst. To oczekiwany rezultat wynikający z przykładu, a nie stwierdzenie, że przeprowadzono test w interfejsie Maca.

Sample entry: green notebook.

Sample entry: orange notebook.

Otwórz także older.txt. Powinien nadal zawierać tylko Sample entry: blue notebook. Sprawdzenie obu plików potwierdza dwa elementy zadania: wybór jednego pliku docelowego i zachowanie drugiego pliku bez zmian.

Zmień czynność Tekst na Sample entry: yellow notebook. i uruchom skrót ponownie, aby dodać drugi przykładowy wpis. Powinien pojawić się kolejny oddzielony wpis w newer.txt, o ile żaden inny kwalifikujący się plik nie stał się nowszy. Dwukrotne uruchomienie skrótu z tym samym tekstem dopisze go dwa razy; ten program nie wykrywa zduplikowanych wpisów.

Przykłady sprawdzono na podstawie dokumentacji, ale nie uruchomiono ich tutaj: dostępne środowisko nie ma ani Skrótów dla macOS, ani zsh. Zanim zmienisz przypisanie folderu, sprawdź działanie na tymczasowych plikach na swoim Macu.

Poznaj działanie pustych folderów, kolizji i zmieniających się plików

Ten sposób wymaga istniejącego pliku docelowego. Brak folderu, pusty folder lub folder zawierający wyłącznie niekwalifikujące się elementy powoduje błąd przed dopisaniem tekstu. Skrypt nie tworzy pliku domyślnego, nie wybiera podfolderu ani nie przechodzi do dokumentu o innej nazwie.

Kolizji nazw unika się, całkowicie rezygnując z tworzenia pliku docelowego. Konfiguracja przerywa działanie, gdy folder o podanej nazwie już istnieje. Podczas zwykłego uruchamiania skrótu wybrany plik zachowuje swoją nazwę: skrypt go nie zmienia ani nie zapisuje drugiej kopii. Zachowanie w przypadku braku pliku określają osobno udokumentowane opcje dopisywania w zsh. Przekierowanie

Jeśli wynik różni się od oczekiwanego, wykonaj tę krótką diagnostykę:

  1. Sprawdź przypisanie folderu. Musi wskazywać folder utworzony podczas konfiguracji.
  2. Sprawdź kryteria wyboru. Wzorzec z przykładu obejmuje widoczne zwykłe pliki kończące się małymi literami .txt, znajdujące się na najwyższym poziomie folderu.
  3. Sprawdź kolejność według modyfikacji. Zobacz Datę modyfikacji w Finderze, pamiętając, że edycja pliku może sprawić, że zostanie on kolejnym celem.
  4. Sprawdź identyczne znaczniki czasu. Edytuj i zapisz wybrany plik przykładowy później, a następnie ponownie sprawdź kolejność.
  5. Sprawdź połączenie czynności. Jedna wartość tekstowa musi dotrzeć do powłoki jako jeden argument.

Skrypt jest przeznaczony do folderu, którego zawartość nie zmienia się podczas działania. Wybór i zapis to osobne operacje: inny proces może w międzyczasie zmodyfikować, zastąpić lub dodać plik. Te kontrole nie zmieniają przebiegu w transakcję, a błąd zapisu może pozostawić częściowo dopisany wpis. Po błędzie dopisywania sprawdź plik przed ponowną próbą.

Kiedy używać natywnych filtrów plików

Apple opisuje Filtruj pliki jako czynność, która przyjmuje zawartość, zawęża ją za pomocą filtrów i przekazuje dalej pasujące wyniki. Jej ogólne ustawienia filtrowania pozwalają sortować wyniki i ograniczać ich liczbę. Pomagają wybrać plik, ale same nie dopisują tekstu. Wprowadzenie do czynności Znajdź i Filtruj, Dodawanie parametrów filtra

W tym przewodniku wybór i zapis odbywają się razem w skrypcie powłoki, dzięki czemu wzorzec plików, zachowanie przy identycznych znacznikach czasu i wymóg istnienia pliku są jasno określone. Jeśli utworzysz inny łańcuch czynności korzystający z plików, najpierw sprawdź Pokaż informacje każdej czynności: wynik typu Plik, zawartość pliku przekonwertowana na Tekst i ścieżka przedstawiona jako Tekst to różne wartości. Apple udostępnia opisy czynności właśnie po to, by określić typy danych wejściowych i wyjściowych. Poruszanie się po liście czynności w Skrótach na Macu

Gdy przykład działa zgodnie z oczekiwaniami, zachowaj jasne założenia przy dostosowywaniu: jeden wpis tekstowy, jeden wyznaczony folder lokalny i jeden ściśle najnowszy kwalifikujący się plik. Dzięki temu każde uruchomienie jest przewidywalne i wiadomo, gdzie szukać przyczyny, gdy skrót się zatrzyma.

Źródła