Gebruik Mac-opdrachten om tekst door te geven aan een shellscript dat het laatst gewijzigde tekstbestand in één lokale map selecteert en je invoer eraan toevoegt. Deze handleiding gebruikt tijdelijke voorbeeldbestanden en stopt als de map leeg is of de nieuwste tijdstempel gelijk is aan die van een ander bestand.
De taak is hier specifiek: een korte invoer toevoegen aan een bestaand tekstbestand zonder dat bestand telkens handmatig te kiezen. Apple documenteert ondersteuning voor shellscripts in Mac-opdrachten. De onderstaande workflow combineert deze ondersteunde mogelijkheid met gedocumenteerde zsh-selectie van bestanden en gedrag voor toevoegen. Maak kennis met Opdrachten voor macOS
Bepaal wat ‘nieuwste bestand’ betekent
In dit artikel betekent nieuwste het laatst gewijzigde. Het script neemt alleen zichtbare, gewone bestanden mee waarvan de naam eindigt op .txt in kleine letters, rechtstreeks in de aangewezen map. Submappen en symbolische koppelingen worden uitgesloten. Deze selectieregels zijn gebaseerd op bestandsnaampatronen en kwalificaties van zsh. Expansie
Deze definitie heeft gevolgen voor herhaald uitvoeren. Nadat je tekst aan een bestand hebt toegevoegd, verandert de wijzigingstijd, waardoor dat bestand doorgaans het nieuwste geschikte bestand blijft. Als je het nieuwste nieuw aangemaakte document wilt volgen, geldt een andere regel: ga er niet van uit dat deze workflow selecteert op basis van aanmaakdatum.
Kies voordat je de opdracht bouwt de regel die bij je taak past:
| Je bedoelde taak | Past dit voorbeeld? |
|---|---|
Tekst toevoegen aan het laatst bewerkte .txt-bestand |
Ja |
| Tekst toevoegen aan het bestand met de nieuwste datum in de naam | Nee; bestandsnamen worden niet als datums geïnterpreteerd |
| Tekst toevoegen aan het laatst aangemaakte bestand | Nee; de aanmaaktijd wordt niet gebruikt |
| Bestanden in submappen meenemen | Nee; de selectie is beperkt tot één map |
| Tekst toevoegen aan een document met opmaak of een pdf | Nee; dit voorbeeld schrijft platte tekst |
De Finder biedt een handige visuele controle. Open de map in de lijstweergave en klik op de kolomkop Wijzigingsdatum; klik indien nodig nogmaals om het nieuwste item bovenaan te zetten. Apple documenteert zowel sorteren op kolom als de sorteervolgorde omkeren. De weergave in de Finder helpt je het resultaat te controleren, maar het script voert de selectie zelf uit. Items sorteren en ordenen in de Finder op de Mac
Maak een tijdelijke voorbeeldmap
In het voorbeeld wordt een map met de naam Shortcut Append Demo in je thuismap gebruikt. De installatie stopt bewust als die naam al bestaat, in plaats van de inhoud te hergebruiken. Er worden twee synthetische tekstbestanden gemaakt, met een interval van twee seconden zodat het tweede bestand een latere wijzigingstijd zou moeten hebben.
Open Terminal, plak dit volledige installatieblok en druk op Return. De heredoc tussen aanhalingstekens voert de opdrachten uit in een afzonderlijk zsh-proces, zodat een mislukte installatie dat proces beëindigt.
/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
De installatie gebruikt uitvoeromleiding om bestanden te maken, maar pas nadat de nieuwe map met succes is aangemaakt. Apple maakt onderscheid tussen gewone uitvoeromleiding, die opdrachtuitvoer naar een bestand schrijft, en omleiding voor toevoegen, die uitvoer aan het einde toevoegt. Terminalinvoer en -uitvoer omleiden op de Mac
Als de installatie meldt dat de map al bestaat, kies dan een andere tijdelijke naam en wijzig de maptoewijzing zowel in de installatie als in het onderstaande opdrachtscript. Voer afzonderlijke regels voor het schrijven van bestanden niet opnieuw uit in een bestaande map.
Bouw de opdracht en behoud de tekstinvoer
Maak een nieuwe opdracht aan in de app Opdrachten en noem die Append to Newest Text File. Gebruik de actiebibliotheek om de onderstaande acties toe te voegen. Apple documenteert hoe je in de actiebibliotheek zoekt en via Toon info controleert welke invoer een actie accepteert en welke uitvoer deze oplevert. Door de actielijst navigeren in Opdrachten op de Mac
- Voeg een actie
Teksttoe met de synthetische invoerSample entry: orange notebook. - Voeg direct daarna
Voer shellscript uittoe. - Stel de shell in op
/bin/zsh. - Stel de invoer van het script in op de uitvoer van de voorgaande actie
Tekst. - Stel
Geef invoer doorin opals argumenten. - Vervang het scriptveld door het volledige script in de volgende sectie.
De beoogde verbinding is één Tekstwaarde naar één scriptargument. Het script leest dat argument als $1. De uitvoer bij succes is een tekstbevestiging met het doelpad; dat pad is geen Opdrachten-bestandsobject en de uitvoer bevat niet de volledige inhoud van het bestand.
Laat de invoer gekoppeld aan de uitvoer van Tekst. Als je een bestand, een lijst met bestandsnamen of de niet-gerelateerde invoer van de opdracht doorgeeft, ontvangt het script iets anders. Het script controleert het aantal argumenten, zodat een onverwachte verzameling invoer niet als meerdere items wordt toegevoegd.
Als scripts zijn uitgeschakeld, open je Opdrachten > Instellingen, selecteer je Geavanceerd en schakel je Sta uitvoering van scripts toe in. Dit zijn de door Apple gedocumenteerde instellingen om scripts in opdrachten toe te staan. Instructies van Apple voor de scriptinstelling
Voeg het script toe dat selecteert en tekst toevoegt
Plak dit volledige programma in Voer shellscript uit. Je hebt geen gedownloade hulpprogramma’s of afzonderlijk scriptbestand nodig. De maptoewijzing komt overeen met de bovenstaande tijdelijke installatie.
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"
De selectie-expressie bouwt een array met overeenkomende bestandspaden. In (N.om) staat N een lege overeenkomst toe, beperkt . de overeenkomsten tot gewone bestanden en sorteert om op wijzigingstijd, met het nieuwste bestand vooraan. Door paden in een array te bewaren, worden bestandsnamen met spaties niet opgesplitst. Expansie
De volgende controle vereist dat het eerste bestand strikt nieuwer is dan het tweede. Als hun wijzigingstijden gelijk zijn, stopt de opdracht in plaats van stilzwijgend een bestand te kiezen. zsh documenteert -nt voor het vergelijken van de ouderdom van bestanden, evenals de controles op gewone bestanden, symbolische koppelingen en beschrijfbare bestanden die hier worden gebruikt. Voorwaardelijke expressies
De opdracht om tekst toe te voegen gebruikt een vast formaat printf en geeft je invoer door als argument voor %s. Percenttekens en backslashes in de invoer worden daardoor als tekst behandeld en niet als aanvullende opmaakinstructies. De beginregel scheidt de invoer van bestaande tekst; de laatste regelbeëindiging sluit de invoer af. Als het bestand al eindigt met een regelbeëindiging, ontstaat er zo een lege regel tussen de items. Shell ingebouwde opdrachten
Het script heft ook CLOBBER en APPEND_CREATE op. zsh documenteert dat omleiding voor toevoegen mislukt wanneer het doel niet bestaat als beide opties niet zijn ingesteld. Dit is van belang als het geselecteerde bestand verdwijnt voordat de tekst wordt toegevoegd: het script moet een fout melden in plaats van op het oude pad een vervangend bestand te maken. Omleiding
Controleer het resultaat met de voorbeeldbestanden
Voer de opdracht één keer uit. In de ongewijzigde voorbeeldmap is newer.txt het verwachte doelbestand. Open dat bestand en controleer of het de volgende inhoud heeft. Dit is het verwachte resultaat op basis van het voorbeeld, geen bewering dat er een Mac-gebruikersinterfacetest is uitgevoerd.
Sample entry: green notebook.
Sample entry: orange notebook.
Open ook older.txt. Dit bestand zou alleen Sample entry: blue notebook. moeten bevatten. Door beide bestanden te controleren, verifieer je de twee onderdelen van de taak: één doelbestand selecteren en het andere bestand behouden.
Probeer een tweede synthetische invoer door de actie Tekst te wijzigen in Sample entry: yellow notebook. en de opdracht opnieuw uit te voeren. Verwacht nog een gescheiden invoer in newer.txt, zolang er geen ander geschikt bestand nieuwer is geworden. Als je de opdracht twee keer met dezelfde invoer uitvoert, wordt die invoer twee keer toegevoegd; dit programma detecteert geen dubbele items.
Deze voorbeelden zijn gecontroleerd aan de hand van de documentatie, maar zijn hier niet uitgevoerd: de beschikbare omgeving bevat noch macOS Opdrachten noch zsh. Voer de controle met de tijdelijke bestanden uit op je Mac voordat je de maptoewijzing aanpast.
Begrijp lege mappen, naamconflicten en veranderende bestanden
De workflow vereist dat het doelbestand al bestaat. Een ontbrekende map, een lege map of een map met uitsluitend ongeschikte items veroorzaakt een fout voordat tekst wordt toegevoegd. De workflow maakt geen standaardbestand aan, kiest geen submap en valt niet terug op een document met een andere naam.
Naamconflicten worden voorkomen door helemaal geen doelbestand aan te maken. De installatie stopt als de mapnaam al bestaat. Bij normaal gebruik van de opdracht behoudt het geselecteerde bestand zijn huidige naam: het script hernoemt het niet en slaat geen tweede kopie op. Het gedocumenteerde gedrag van de zsh-opties voor toevoegen bepaalt wat er gebeurt als het bestand ontbreekt. Omleiding
Gebruik deze korte diagnostische reeks als het resultaat niet aan je verwachting voldoet:
- Controleer de maptoewijzing. Deze moet overeenkomen met de map die tijdens de installatie is gemaakt.
- Controleer of bestanden in aanmerking komen. Het voorbeeldpatroon omvat zichtbare gewone bestanden waarvan de naam eindigt op
.txtin kleine letters, op het hoogste niveau van de map. - Controleer de volgorde op wijzigingstijd. Bekijk
Wijzigingsdatumin de Finder en houd er rekening mee dat een bewerkt bestand het volgende doel kan worden. - Controleer of tijdstempels gelijk zijn. Bewerk het bedoelde voorbeeldbestand, sla het later op en controleer de volgorde opnieuw.
- Controleer de actieverbinding. Eén tekstwaarde moet als één argument bij de shell aankomen.
Het script is bedoeld voor een map die tijdens de uitvoering ongewijzigd blijft. Selecteren en schrijven zijn afzonderlijke bewerkingen: een ander proces kan in de tussentijd een bestand wijzigen of vervangen, of een bestand toevoegen. De controles maken van de workflow geen transactie en een schrijffout kan een gedeeltelijk toegevoegde invoer achterlaten. Controleer het bestand voordat je het na een fout bij het toevoegen opnieuw probeert.
Waar native bestandsfilters van pas komen
Apple documenteert Filter Bestanden als een actie die inhoud accepteert, deze met filters beperkt en de overeenkomende resultaten doorgeeft. Met de algemene filterinstellingen kun je resultaten sorteren en het aantal beperken. Deze bewerkingen helpen bij het selecteren van een bestand; ze voegen zelf geen tekst toe. Inleiding tot de acties Zoek en Filter, Filterinstellingen toevoegen
Deze handleiding houdt selectie en schrijven bij elkaar in het shellscript, zodat het bestandspatroon, het gedrag bij gelijke tijdstempels en de vereiste dat het bestand al bestaat expliciet zijn. Als je een andere keten met bestandsacties bouwt, bekijk dan eerst de Toon info van elke actie: een bestand als resultaat, bestandsinhoud omgezet naar tekst en een pad weergegeven als tekst zijn verschillende waarden. Apple biedt deze actieomschrijvingen juist om invoer- en uitvoertypen aan te geven. Door de actielijst navigeren in Opdrachten op de Mac
Zodra het voorbeeld werkt zoals verwacht, behoud je dezelfde duidelijke voorwaarden bij het aanpassen: één tekstinvoer, één aangewezen lokale map en één strikt nieuwste geschikt bestand. Zo is elke uitvoering voorspelbaar en weet je precies waar je moet zoeken als de opdracht stopt.
Bronnen
- Maak kennis met Opdrachten voor macOS — Apple Developer.
- Door de actielijst navigeren in Opdrachten op de Mac — Apple Support.
- Geavanceerde privacy- en beveiligingsinstellingen in Opdrachten op de Mac — Apple Support.
- Items sorteren en ordenen in de Finder op de Mac — Apple Support.
- Terminalinvoer en -uitvoer omleiden op de Mac — Apple Support.
- Inleiding tot de acties Zoek en Filter in Opdrachten op de Mac — Apple Support.
- Filterparameters toevoegen aan de acties Zoek en Filter in Opdrachten op de Mac — Apple Support.
- 14 Expansie — The Zsh Development Group.
- 12 Voorwaardelijke expressies — The Zsh Development Group.
- 17 Shell ingebouwde opdrachten — The Zsh Development Group.
- 7 Omleiding — The Zsh Development Group.