För att sortera filer på översta nivån i Nedladdningar till tilläggsmappar, använd ett skript som undersöker omedelbara filer, skapar mappar som txt och csv och hoppar över befintliga destinationsnamn. Börja med det utbytesbara exemplet nedan, förhandsgranska dess flyttar och kör sedan det från Terminal eller Apple Shortcuts.
Den här genomgången är för en Mac-användare som vill flytta lösa filer fysiskt till mappar samtidigt som befintliga undermappar och deras innehåll lämnas ifråga. Huvudbeslutsunderlaget är en förhandsgranskningsrapport: varje berättigad fil får ett föreslaget mål, medan kollisioner och stödda namn får ett explicit hoppmeddelande.
Vad flyttas och vad stannar på plats?
Finder erbjuder sorterings- och grupperingskontroller, samt mappar och Smarta mappar. Apple förklarar att en Smart mapp presenterar matchande filer tillsammans utan att flytta dem. För den här uppgiften är det önskade resultatet faktiska tilläggsmappar som innehåller flyttade filer. Organisera dina filer i Finder på Mac.
Innan du undersöker exemplet, öppna Finder och välj Finder > Inställningar > Avancerat, markera sedan Visa alla filnamnstillägg. Detta gör de filändelser som sorteraren använder synliga. Att visa ett tillägg ändrar inte filens format. Visa eller dölj filnamnstillägg på Mac.
Skriptet nedan använder dessa avsiktliga regler. De beskriver denna implementation, snarare än universellt Finder- eller Shortcuts-beteende:
| träffad objekt | Sorterarens beteende |
|---|---|
En vanlig omedelbar fil som note.TXT |
Föreslår txt/note.TXT; bevarar det ursprungliga filnamnet |
Ett sammansatt namn som bundle.tar.gz |
Använder den sista suffixet: gz/bundle.tar.gz |
| En fil utan punkt, eller som slutar med en punkt | Lämnar den på plats och rapporterar en hoppning |
| En mapp, inklusive en namngiven med ett tillägg | Lämnar den och dess innehåll på plats |
| Ett namn som börjar med en punkt | Exkluderar det från skanningen |
| En symbolisk länk | Lämnar den på plats |
| Ett tillägg som innehåller annat än ASCII-bokstäver och siffror, eller längre än 32 tecken | Lämnar den på plats och rapporterar en hoppning |
| Ett befintligt mål med samma filnamn | Lämnar källan på plats och rapporterar en kollision |
| Ett destinationsmappnamn upptaget av en vanlig fil eller symbolisk länk | Rapporterar en blockerad mapp och lämnar källan på plats |
Tilläggsrestriktionerna håller mappnamnregeln enkel och förutsägbar. En hoppad fil förblir tillgänglig för ett manuellt beslut; skriptet uppfinner inte ett ersättningsnamn eller kasserar den tyst.
Skapa ett utbytesbart Nedladdningar-exempel
Öppna Terminal och klistra in följande komplett installationsblock. Det skapar endast syntetiska textfiler inne i Nedladdningar/ExtensionSortDemo. Vissa har illustrativa tillägg som .gz; deras innehåll är enkel exempeltext, inte exempel på dessa format. Installationen stoppar om den demomappen redan finns, så en omkörning kommer inte att återställa ett tidigare test.
Apple dokumenterar Terminal som ett sätt att köra kommandon och shell-skript, och dokumenterar mv för att flytta lokala filer. Här ger Terminal ett läsbart sätt att förhandsgranska varje planerad flytta innan den görs. Vad är Terminal på Mac?, Hantera filer i Terminal på Mac.
/bin/bash <<'BASH'
set -eu
demo="$HOME/Downloads/ExtensionSortDemo"
/bin/mkdir "$demo"
/bin/mkdir "$demo/nested" "$demo/txt"
printf 'sample text\n' > "$demo/sample.txt"
printf 'uppercase suffix example\n' > "$demo/note.TXT"
printf 'name,value\nblue,1\n' > "$demo/palette.csv"
printf 'synthetic compound-name example\n' > "$demo/bundle.tar.gz"
printf 'no extension example\n' > "$demo/README"
printf 'trailing dot example\n' > "$demo/trailing."
printf 'hidden example\n' > "$demo/.hidden.txt"
printf 'nested example\n' > "$demo/nested/inside.txt"
printf 'existing destination example\n' > "$demo/txt/sample.txt"
printf 'blocks creation of a csv folder\n' > "$demo/csv"
printf 'Created demo folder: %s\n' "$demo"
BASH
Öppna Nedladdningar i Finder, öppna sedan ExtensionSortDemo. Observera de två olika filerna som heter sample.txt: en på demons översta nivå och en redan inne i txt. Observera också att csv är en fil. Dessa är avsiktliga tester av två vanliga orsaker till att en flytta ska hoppas över.
Förhandsgranska sorteraren innan du flyttar filer
Klistra in det kompletta programmet nedan i Terminal. Dess initiala inställning är mode=preview, så det rapporterar föreslagna flyttar utan att skapa tilläggsmappar eller flytta filer. Den konfigurerade roten är den utbytesbara demomappen, inte hela Nedladdningsmappen.
/bin/bash <<'BASH'
set -u
export LC_ALL=C
unset GLOBIGNORE
shopt -s nullglob
shopt -u dotglob
root="$HOME/Downloads/ExtensionSortDemo"
mode=preview
case "$mode" in
preview|move) ;;
*) printf 'Invalid mode\n' >&2; exit 1 ;;
esac
if [ ! -d "$root" ] || [ -L "$root" ]; then
printf 'Root must be an existing ordinary folder\n' >&2
exit 1
fi
for file in "$root"/*; do
if [ -L "$file" ] || [ ! -f "$file" ]; then
printf 'SKIP non-regular: %q\n' "$file"
continue
fi
name=${file##*/}
case "$name" in
*.*) ext=${name##*.} ;;
*) printf 'SKIP no extension: %q\n' "$name"; continue ;;
esac
case "$ext" in
''|*[!A-Za-z0-9]*)
printf 'SKIP unsupported extension: %q\n' "$name"
continue ;;
esac
if [ "${#ext}" -gt 32 ]; then
printf 'SKIP long extension: %q\n' "$name"
continue
fi
ext=$(printf '%s' "$ext" | /usr/bin/tr '[:upper:]' '[:lower:]')
folder="$root/$ext"
dest="$folder/$name"
if [ -L "$folder" ] || { [ -e "$folder" ] && [ ! -d "$folder" ]; }; then
printf 'SKIP blocked folder: %q\n' "$folder"
continue
fi
if [ -e "$dest" ] || [ -L "$dest" ]; then
printf 'SKIP collision: %q\n' "$dest"
continue
fi
if [ "$mode" = preview ]; then
printf 'WOULD MOVE %q -> %q\n' "$file" "$dest"
continue
fi
/bin/mkdir -p "$folder" || exit 1
/bin/mv -n "$file" "$dest" || exit 1
if [ -e "$file" ] || [ -L "$file" ]; then
printf 'NOT MOVED: %q\n' "$file" >&2
exit 1
fi
printf 'MOVED %q -> %q\n' "$file" "$dest"
done
printf 'Finished (%s). Review all SKIP lines.\n' "$mode"
BASH
Mönstret för omedelbara barn \"$root\"/* nedstiger inte i kataloger. Filkontrollerna exkluderar sedan kataloger och symboliska länkar. nullglob hanterar en tom mapp utan att behandla ett omatchat mönster som ett filnamn; att inaktivera dotglob exkluderar punktprefixade namn. Dessa beteenden dokumenteras i Apples distribuerade Bash-manual. Bash-manual.
Skriptet extraherar den sista suffixet och konverterar dess bokstäver till gemener med tr. Därför behåller note.TXT sitt filnamn men hamnar i txt. Apples tr-manual dokumenterar den versal-till-gemener-teckenmappning som används här. tr(1) — översätt tecken.
För denna fixture är de viktiga förväntade resultaten:
| Syntetisk källa | Förväntat förhandsgranskningsresultat |
|---|---|
note.TXT |
Skulle flytta till txt/note.TXT |
bundle.tar.gz |
Skulle flytta till gz/bundle.tar.gz |
sample.txt |
Kollision med txt/sample.txt; hoppa över |
palette.csv |
Mappnamnet csv blockeras av en fil; hoppa över |
README |
Inget tillägg; hoppa över |
trailing. |
Tomt tillägg; hoppa över |
nested/inside.txt |
Undersöks aldrig |
.hidden.txt |
Undersöks aldrig |
Dessa är förväntade filsystemresultat, inte ett påstående att flytterna utfördes under förberedelsen. Programmet passade en Bash-syntaxkontroll, och en separat deterministisk filnamnsmappningskontroll bekräftade suffixextraktion och gemenkonvertering. Denna förberedelsemiljö var skrivskyddad, så det kompletta macOS-flyttarbeteflödet utfördes inte.
Flytta exempel-filerna och kontrollera resultatet
När förhandsgranskningen matchar tabellen, klistra in samma kompletta program igen med bara mode=preview ändrat till mode=move. Behåll demoroten oförändrad för detta test.
I flyttar-läge skapar mkdir -p den nödvändiga mappen eller accepterar en befintlig katalog. Det omvandlar inte en befintlig vanlig fil till en mapp, varför skriptet kontrollerar destinationsmappen först. mkdir(1) — skapa kataloger.
Flytten använder macOS mv -n, vars dokumenterade beteende är att undvika att skriva över en befintlig fil. Den tidigare existenskontrollen ger en läsbar kollisionsrapport; den efterföljande källkontrollen fångar upp en flytta som lämnade källan kvar. Programmet stoppar vid en rapporterad kommandofel. mv(1) — flytta filer.
Kontrollera demon i Finder. Du bör hitta note.TXT inne i txt, och bundle.tar.gz inne i en nyskapad gz-mapp. Båda versionerna av sample.txt bör fortfarande finnas på sina ursprungliga platser. palette.csv bör förbli på översta nivån, och nested/inside.txt bör förbli inne i nested.
Den sista Finished-raden betyder att skanningen slutfördes; granska även dess hoppmeddelanden. Att köra sorteraren igen bör lämna de redan sorterade filerna inne i sina mappar eftersom dessa mappar inte skannas rekursivt.
Kör samma sorterare från Apple Shortcuts
Shortcuts kan fungera som en knapp för det här skriptet. Apple dokumenterar inbyggt stöd för att skriva och köra shell-skript i Shortcuts-redigeraren. Shell-programmet utför tilläggsmappningen och existenskontrollerna; denna artikel antar inte att en inbyggd filflyttningsaktion har identiskt kollisionsbeteende. Möt Shortcuts för macOS.
Skapa genvägen manuellt och håll den inriktad på demon under testet:
- Öppna Shortcuts, klicka på lägg-knappen och namnge genvägen
Sort Extension Demo. - Sök i åtgärdslistan efter
Kör shell-skriptoch lägg till den åtgärden. - Ställ in dess shell på
/bin/bash. Klistra in det kompletta sorterarblocket ovan, inklusive dess öppnande/bin/bash-rad och slutligaBASH-avgränsare, i skriptfältet. Behållmode=previewinitialt. - Lägg till
Snabbvisningefter skriptåtgärden och koppla den till skriptets utdata. - Kör genvägen och inspektera förhandsgranskningsrapporten innan du ändrar skriptet till
mode=move.
Apple dokumenterar att skapa en genväg genom att lägga till åtgärder och testa den, och rekommenderar Snabbvisning för att inspektera innehåll som skickas mellan åtgärder. Skapa en anpassad genväg på Mac, Testa dina åtgärder i Shortcuts på Mac.
Den här genvägen kräver inga inkommande filer: rotvägen definieras inne i skriptet. Dess framgångsrika utdata är en textrapport, som Snabbvisning visar. Den rapporten är inte en samling flyttade filobjekt att mata in i en annan filåtgärd. För att inspektera en åtgärds accepterade inmatning och resulterande utdata på din installerade version, kontrollklicka på dess ikon och välj Visa info, som Apple dokumenterar. Navigera åtgärdslistan i Shortcuts på Mac.
Om Shortcuts kräver att skriptkörning aktiveras, är Apples dokumenterade inställning Shortcuts > Inställningar > Avancerat > Tillåt körning av skript. Om shell-åtgärden inte är tillgänglig på din installation, använd det kompletta Terminal-programmet ovan; det utför samma sorteringsuppgift oberoende. Avancerade integritetsskydds- och säkerhetsinställningar i Shortcuts på Mac.
Tillämpa regeln på översta nivån i Nedladdningar
Efter det utbytesbara testet är konfigurationsändringen för den faktiska Nedladdningsmappen följande en-rads-ersättning inne i sorteraren. Det här är en konfigurationsfragment, inte ett fristående sorteringsprogram:
root="$HOME/Downloads"
Återgå till mode=preview när du ändrar roten. Granska varje föreslaget mål och hoppmeddelande innan du aktiverar flyttar. Programmet bearbetar berättigade omedelbara filer tillsammans; det erbjuder inte en individuell urvalsfråga.
Använd det som en manuellt startad batch på en mapp vars filer har slutat anlända. Skriptet avgör inte nedladdningsslut, övervakar inte framtida tillägg eller koordinerar samtidiga körningar. Dess kontroller och flytta är separata operationer, så håll annan filflyttningsaktivitet borta från mappen medan det körs. En förhandsgranskning är en rapport av det aktuella tillståndet, inte en reservation av dessa destinationer.
Vid en kollision, inspektera de två filerna i Finder och bestäm om du vill byta namn på filen på översta nivån eller lämna den där den är. För en blockerad tilläggsmapp, lös objektet som upptar det mappnamnet innan du kör om. Ingen av dessa tillstånd kräver att programmet ändras för att skriva över filer.
Avsluta genom att kontrollera de faktiska destinationsmapparna i Finder och granska eventuella kvarvarande filer på översta nivån mot rapporten. Det utbytesbara exemplet ger dig ett konkret acceptanstest: de avsedda filerna flyttas, befintliga namn förblir intakta och nästlat innehåll stannar där det började.
Källor
- Organisera dina filer i Finder på Mac — Apple Support.
- Visa eller dölj filnamnstillägg på Mac — Apple Support.
- Vad är Terminal på Mac? — Apple Support.
- Hantera filer i Terminal på Mac — Apple Support.
- Bash-manual — Apple OSS Distributions.
- tr(1) — översätt tecken — Apple OSS Distributions.
- mkdir(1) — skapa kataloger — Apple OSS Distributions.
- mv(1) — flytta filer — Apple OSS Distributions.
- Möt Shortcuts för macOS — Apple Developer.
- Skapa en anpassad genväg på Mac — Apple Support.
- Testa dina åtgärder i Shortcuts på Mac — Apple Support.
- Navigera åtgärdslistan i Shortcuts på Mac — Apple Support.
- Avancerade integritetsskydds- och säkerhetsinställningar i Shortcuts på Mac — Apple Support.