Om du vill flytta filer med samma namn och behålla båda kopiorna ger du varje inkommande fil ett oanvänt namn i målmappen innan du flyttar den. Den här guiden skapar en genväg för Mac som lägger till numrerade suffix och visar resultatet med tillfälliga textfiler.
Uppgiften är att flytta vanliga filer från en lokal mapp till en annan som kanske redan innehåller filer med samma namn. Befintliga filer i målmappen ligger kvar; inkommande filer får namn som notes (2).txt. Att behålla båda betyder att båda filerna finns kvar i målmappen efter flytten – den inkommande filen finns inte längre i källmappen.
Vad dokumenterar Apple om att behålla båda filerna?
Apple dokumenterar stöd för att köra skalskript direkt i Genvägar. De offentliga Genvägar-sidor från Apple som citeras här anger ingen Keep Both-policy för namnkrockar i åtgärden Move File. I stället för att förlita sig på en odokumenterad inställning gör det här arbetsflödet ett uttryckligt namnval i Run Shell Script. Apple beskriver skriptfunktionen i Lär känna Genvägar för macOS.
Det underliggande macOS-kommandot har ett mer begränsat dokumenterat beteende: mv -n skriver inte över en befintlig fil. Det skapar inget nytt namn. Därför behöver den här genvägen både en loop som väljer filnamn och alternativet som förhindrar överskrivning. Det är två separata funktioner, vilket framgår av Apples publicerade manualkälla för mv(1).
Det finns också begränsningar för sammanslagning av mappar i Finder. Apple uppger att Merge bara visas när den ena mappen innehåller objekt som saknas i den andra. Om mapparna innehåller olika versioner av filer med identiska namn visas alternativen Stop eller Replace. Att slå ihop mappar ger alltså inte det beteende med numrerade filer som behövs här. Se Ordna filer i mappar på Mac.
Förbered ett tillfälligt exempel med filer som har samma namn
Använd det här exemplet med två mappar på samma lokala skiva. Det hanterar vanliga, icke dolda filer direkt i källmappen. Det bearbetar inte undermappar rekursivt, flyttar inte alias eller symboliska länkar och slår inte ihop paket. Kör bara en instans åt gången och se till att ingen annan process ändrar mapparna.
Genvägen kräver att Run Shell Script är tillgängligt och går att köra på din Mac. Om åtgärden inte går att köra i din konfiguration kan du använda Finder-metoden längre fram i artikeln. Exemplen nedan kräver ingen ytterligare programvara.
Öppna Terminal och klistra in hela det här förberedelsekommandot. Det skapar en ny mapp på skrivbordet som bara innehåller syntetisk text. Om Shortcuts-name-demo redan finns avslutas kommandot i stället för att återanvända innehållet.
/bin/bash <<'BASH'
set -e
root="$HOME/Desktop/Shortcuts-name-demo"
/bin/mkdir "$root"
/bin/mkdir "$root/Incoming" "$root/Collected"
printf '%s\n' 'Incoming synthetic notes.' > "$root/Incoming/notes.txt"
printf '%s\n' 'Existing synthetic notes.' > "$root/Collected/notes.txt"
printf '%s\n' 'Earlier synthetic second copy.' > "$root/Collected/notes (2).txt"
printf '%s\n' 'Synthetic readme.' > "$root/Incoming/readme.txt"
printf 'Example folder: %s\n' "$root"
BASH
Namnkrocken är avsiktlig: målmappen innehåller redan både notes.txt och notes (2).txt. En genväg som bara lägger till (2) skulle stöta på ännu en namnkrock. Den användbara regeln är att testa successiva namnförslag tills ett namn är ledigt.
För att göra det enklare att granska filerna aktiverar du Show all filename extensions under Finder > Settings > Advanced. Apple förklarar att dolda filändelser bara påverkar hur namnet visas, medan en ändring av själva filändelsen kan påverka vilken app som öppnar filen. Låt .txt vara kvar i det här exemplet. Se Visa eller dölj filnamnstillägg på Mac.
Skapa genvägen med uttrycklig hantering av namnkrockar
Skapa en genväg med plusknappen i Genvägar och ge den namnet Move Files and Keep Both. Sök efter Run Shell Script i åtgärdsbiblioteket och lägg till den. Apple beskriver hur du skapar genvägar och lägger till åtgärder i Skapa en anpassad genväg på Mac.
Ställ in åtgärdens skal på /bin/bash och ersätt exempelskriptet med hela programmet nedan. Den här versionen hämtar sökvägarna till de två mapparna från variabler i skriptet. Den använder inte indata från genvägen, markerade Finder-objekt eller standardindata, så inställningen för hur indata skickas saknar betydelse.
set -e
shopt -s nullglob
src_dir="$HOME/Desktop/Shortcuts-name-demo/Incoming"
dst_dir="$HOME/Desktop/Shortcuts-name-demo/Collected"
fail() {
printf '%s\n' "$1" >&2
exit 1
}
[[ -d "$src_dir" ]] || fail "Source folder does not exist."
[[ -d "$dst_dir" ]] || fail "Destination folder does not exist."
src_dir=$(cd "$src_dir" && pwd -P)
dst_dir=$(cd "$dst_dir" && pwd -P)
[[ "$src_dir" != "$dst_dir" ]] || fail "Choose different folders."
moved=0
for src in "$src_dir"/*; do
if [[ -L "$src" || ! -f "$src" ]]; then
printf 'Skipped non-regular item: %s\n' "$src" >&2
continue
fi
name=${src##*/}
stem=$name
ext=
if [[ "$name" == *.* && "$name" != .* && "$name" != *. ]]; then
stem=${name%.*}
ext=.${name##*.}
fi
target="$dst_dir/$name"
number=2
while [[ -e "$target" || -L "$target" ]]; do
target="$dst_dir/$stem ($number)$ext"
number=$((number + 1))
done
/bin/mv -n "$src" "$target" || fail "Move failed: $src"
if [[ -e "$src" || -L "$src" || ! -f "$target" ]]; then
fail "Move was not completed as expected: $src"
fi
moved=$((moved + 1))
printf 'Moved: %s -> %s\n' "$name" "${target##*/}"
done
printf 'Completed: %s file(s) moved.\n' "$moved"
Lägg till Quick Look efter skriptåtgärden för att granska rapporten. Apple rekommenderar särskilt att du infogar Quick Look under testning för att se vilket innehåll som skickas mellan åtgärder. Se Testa åtgärder i Genvägar på Mac.
Rapporten innehåller text som beskriver slutförda flyttar. Den är inte en lista med flyttade File-objekt. Om du senare bygger ut genvägen ska du inte behandla rapportens rader som filindata. Apple dokumenterar att åtgärder tar emot och ger ifrån sig särskilda innehållstyper. Använd Show Info på en åtgärd för att granska vilken indata den tar emot och vilka utdata den ger. Se Åtgärdskopplingar i Genvägar på Mac.
Hur bevarar namnregeln båda kopiorna?
För varje källfil kontrollerar skriptet först om den ursprungliga sökvägen i målmappen är upptagen. Om den är det provar skriptet (2), sedan (3) och fortsätter tills ett namnförslag är ledigt. Befintliga kataloger och symboliska länkar räknas också som upptagna namn. Den slutliga flytten använder mv -n som en extra kontroll mot överskrivning, enligt Apples dokumentation om mv(1).
| Inkommande fil | Målmappen innehåller redan | Valt namn i målmappen |
|---|---|---|
notes.txt |
Inget med det namnet | notes.txt |
notes.txt |
notes.txt |
notes (2).txt |
notes.txt |
notes.txt, notes (2).txt |
notes (3).txt |
readme |
readme |
readme (2) |
archive.tar.gz |
archive.tar.gz |
archive.tar (2).gz |
Det här är programmets namnregler, inte ett påstående om Finders automatiska namnval. Bara den sista filändelsen avskiljs: .gz ligger kvar sist i archive.tar (2).gz. En inkommande fil som redan heter notes (2).txt behåller sitt namn, så att resultatet vid behov blir notes (2) (2).txt. Skriptet tolkar inte ett befintligt nummer som en version.
Programmet omger sökvägar med citattecken och går igenom filnamn som skalet expanderar, i stället för att dela upp en textbaserad fillista. Filnamn som innehåller mellanslag förblir därför enskilda objekt. Syntaxen är avsiktligt skriven för Bash; låt /bin/bash vara valt. Apples Grunderna i skalskript förklarar varför skillnader mellan olika skal är viktiga.
Kör exemplet och kontrollera resultatet
Kör genvägen en gång och granska sedan båda mapparna i Finder. Med de syntetiska exempeldata som ingår ska målmappen innehålla följande:
notes.txt, som fortfarande innehållerExisting synthetic notes.notes (2).txt, som fortfarande innehållerEarlier synthetic second copy.notes (3).txt, som innehållerIncoming synthetic notes.readme.txt, som innehållerSynthetic readme.
Mappen Incoming bör nu vara tom, och rapporten bör sluta med Completed: 2 file(s) moved. Om du kör genvägen igen utan att lägga till filer bör den rapportera noll flyttar. Det här är förväntade resultat för exemplet; hela arbetsflödet i Genvägar för macOS kördes inte när artikeln förbereddes. Uttrycken som delar upp filnamnen kontrollerades separat med syntetiska namn.
Om genvägen stannar ska du granska båda mapparna innan du kör den igen. Varje fil flyttas separat, så ett fel vid en senare fil återställer inte tidigare flyttar. Skriptet kontrollerar om källfilen finns kvar efter varje kommando i stället för att anta att varje avslutat kommando betyder att en fil har flyttats.
Vid ett vanligt flyttfel rekommenderar Apple att du kontrollerar om filen är öppen och om det finns tillräckligt med ledigt utrymme i målmappen. Se Om du inte kan flytta eller kopiera ett objekt på Mac. Det här programmet kan också misslyckas med en flytt om filnamnet blir för långt när ett suffix läggs till. Då avslutas programmet i stället för att korta ned namnet.
Kontrollen av om ett namn är ledigt och själva flytten är två separata åtgärder. Programmet är avsett för ett manuellt kört, lokalt arbetsflöde där mapparna inte ändras. Det reserverar inte namnförslag mot samtidiga ändringar. Se till att inga samtidiga körningar eller andra processer skriver till exempelmapparna.
Använd Finder om det bara gäller några få namnkrockar
Om det bara gäller några få filer byter du uttryckligen namn på den inkommande filen innan du flyttar den. I det syntetiska exemplet öppnar du Collected, markerar Incoming/notes.txt, trycker på Return, anger notes (3).txt och trycker på Return igen. Apple beskriver hur du byter namn i Byt namn på filer, mappar och skivor på Mac.
Dra sedan den omdöpta filen till Collected på samma skiva. Apple beskriver hur du drar ett objekt till en mapp för att flytta det, håller ned Option för att kopiera det och håller ned Command när du drar till en annan skiva för att flytta det. Se Ordna filer i mappar på Mac. Om en ny namnkonflikt uppstår avbryter du överföringen och väljer ett annat ledigt namn.
När det tillfälliga exemplet fungerar som förväntat på din Mac ändrar du bara src_dir och dst_dir för ett annat par lokala mappar med samma förutsättningar. Behåll loopen som väljer numrerade namn och kontrollerna av slutförandet tillsammans: valet av ett ledigt namn bevarar båda kopiorna i målmappen, medan kontrollen av resultatet visar om den inkommande filen faktiskt flyttades.
Källor
- Lär känna Genvägar för macOS — Apple Developer.
- Manualkälla för mv(1) — Apple Open Source Distributions.
- Ordna filer i mappar på Mac — Apple Support.
- Visa eller dölj filnamnstillägg på Mac — Apple Support.
- Skapa en anpassad genväg på Mac — Apple Support.
- Testa åtgärder i Genvägar på Mac — Apple Support.
- Åtgärdskopplingar i Genvägar på Mac — Apple Support.
- Grunderna i skalskript — Apple Developer.
- Om du inte kan flytta eller kopiera ett objekt på Mac — Apple Support.
- Byt namn på filer, mappar och skivor på Mac — Apple Support.