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:

  1. Öppna Shortcuts, klicka på lägg-knappen och namnge genvägen Sort Extension Demo.
  2. Sök i åtgärdslistan efter Kör shell-skript och lägg till den åtgärden.
  3. Ställ in dess shell på /bin/bash. Klistra in det kompletta sorterarblocket ovan, inklusive dess öppnande /bin/bash-rad och slutliga BASH-avgränsare, i skriptfältet. Behåll mode=preview initialt.
  4. Lägg till Snabbvisning efter skriptåtgärden och koppla den till skriptets utdata.
  5. 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