डुप्लिकेट नाम वाली फ़ाइलों को ले जाते समय दोनों प्रतियाँ रखने के लिए, हर आने वाली फ़ाइल को ले जाने से पहले गंतव्य पर ऐसा नाम दें जो अभी इस्तेमाल में न हो। यह गाइड एक Mac शॉर्टकट बनाती है जो क्रमांकित प्रत्यय जोड़ता है और नतीजा दिखाने के लिए अस्थायी टेक्स्ट फ़ाइलों का उपयोग करता है।

यह काम सामान्य फ़ाइलों को एक स्थानीय फ़ोल्डर से दूसरे में ले जाने का है, जहाँ समान नाम पहले से हो सकते हैं। गंतव्य की मौजूदा फ़ाइलें वहीं रहती हैं; आने वाली फ़ाइलों को notes (2).txt जैसे नाम मिलते हैं। दोनों प्रतियाँ रखने का मतलब है कि स्थानांतरण के बाद दोनों फ़ाइलें गंतव्य में रहेंगी—आने वाली फ़ाइल अपने स्रोत फ़ोल्डर में नहीं रहेगी।

दोनों फ़ाइलें रखने के बारे में Apple क्या दस्तावेज़ित करता है?

Apple, Shortcuts के भीतर सीधे शेल स्क्रिप्ट चलाने की सुविधा का दस्तावेज़ देता है। यहाँ उद्धृत Shortcuts के उसके सार्वजनिक पृष्ठ Move File कार्रवाई के लिए Keep Both टकराव नीति निर्दिष्ट नहीं करते। किसी ऐसे सेटिंग पर निर्भर रहने के बजाय जिसका दस्तावेज़ उपलब्ध नहीं है, यह कार्यप्रवाह Run Shell Script में नाम चुनने का निर्णय स्पष्ट रूप से करता है। Apple इस स्क्रिप्टिंग क्षमता का वर्णन macOS के लिए Shortcuts से परिचय में करता है।

अंतर्निहित macOS कमांड का दस्तावेज़ित व्यवहार अधिक सीमित है: mv -n किसी मौजूदा फ़ाइल को ओवरराइट नहीं करता। यह नया नाम नहीं बनाता। इसलिए इस शॉर्टकट में नाम चुनने का लूप और ओवरराइट न करने वाला विकल्प—दोनों चाहिए। Apple के प्रकाशित mv(1) मैनुअल स्रोत में ये अलग-अलग ज़िम्मेदारियाँ दिखाई गई हैं।

Finder में फ़ोल्डर मर्ज करने की भी सीमाएँ हैं। Apple कहता है कि Merge विकल्प केवल तभी दिखता है जब एक फ़ोल्डर में ऐसी चीज़ें हों जो दूसरे में न हों; जिन फ़ोल्डरों में समान नाम वाली फ़ाइलों के अलग-अलग संस्करण हों, उनमें Stop या Replace विकल्प मिलता है। इसलिए फ़ोल्डर मर्ज करने से यहाँ ज़रूरी क्रमांकित फ़ाइलों वाला व्यवहार नहीं मिलता। देखें Mac पर फ़ाइलों को फ़ोल्डरों में व्यवस्थित करना।

डुप्लिकेट नाम का अस्थायी उदाहरण तैयार करें

एक ही स्थानीय डिस्क पर मौजूद दो फ़ोल्डरों के साथ यह उदाहरण इस्तेमाल करें। यह स्रोत फ़ोल्डर के भीतर सीधे मौजूद सामान्य, गैर-छिपी फ़ाइलों को संभालता है। यह सबफ़ोल्डर में मौजूद फ़ाइलों पर दोबारा काम नहीं करता, न ही एलियास या प्रतीकात्मक लिंक ले जाता है या पैकेज मर्ज करता है। एक बार में शॉर्टकट का केवल एक इंस्टेंस चलाएँ और सुनिश्चित करें कि कोई दूसरी प्रक्रिया किसी भी फ़ोल्डर में बदलाव न कर रही हो।

इस शॉर्टकट के लिए आपके Mac पर Run Shell Script उपलब्ध और चलने योग्य होना चाहिए। यदि आपके सेटअप में यह कार्रवाई नहीं चल सकती, तो इस लेख में आगे दी गई Finder प्रक्रिया अपनाएँ। नीचे दिए गए उदाहरणों के लिए किसी अतिरिक्त सॉफ़्टवेयर की ज़रूरत नहीं है।

Terminal खोलें और यह पूरा सेटअप कमांड पेस्ट करें। यह Desktop पर एक नया फ़ोल्डर बनाता है जिसमें केवल कृत्रिम टेक्स्ट होता है। यदि Shortcuts-name-demo पहले से मौजूद है, तो कमांड उसकी सामग्री दोबारा इस्तेमाल करने के बजाय रुक जाता है।

/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

यह टकराव जानबूझकर बनाया गया है: गंतव्य में notes.txt और notes (2).txt दोनों पहले से मौजूद हैं। केवल (2) जोड़ने वाला शॉर्टकट फिर से नाम के टकराव में फँस जाएगा। उपयोगी नियम यह है कि क्रमशः संभावित नाम जाँचें, जब तक कोई नाम उपलब्ध न मिल जाए।

फ़ाइलें आसानी से देखने के लिए Finder > Settings > Advanced में Show all filename extensions चालू करें। Apple बताता है कि एक्सटेंशन छिपाने से उसका प्रदर्शन बदलता है, जबकि एक्सटेंशन बदलने से यह प्रभावित हो सकता है कि फ़ाइल किस ऐप में खुलेगी। इस उदाहरण में .txt को ज्यों का त्यों रखें। देखें Mac पर फ़ाइल नाम के एक्सटेंशन दिखाना या छिपाना।

टकराव को स्पष्ट रूप से संभालने वाला शॉर्टकट बनाएँ

Shortcuts में जोड़ने वाले बटन का उपयोग करके एक शॉर्टकट बनाएँ और उसका नाम Move Files and Keep Both रखें। कार्रवाई लाइब्रेरी में Run Shell Script खोजें और उसे जोड़ें। Apple Mac पर कस्टम शॉर्टकट बनाना में शॉर्टकट बनाने और कार्रवाइयाँ जोड़ने का तरीका बताता है।

कार्रवाई का शेल /bin/bash पर सेट करें, फिर उसकी उदाहरण स्क्रिप्ट को नीचे दिए गए पूरे प्रोग्राम से बदलें। यह संस्करण स्क्रिप्ट के वेरिएबल से दोनों फ़ोल्डरों के पथ पढ़ता है। यह शॉर्टकट इनपुट, चुने हुए Finder आइटम या मानक इनपुट का उपयोग नहीं करता, इसलिए इनपुट पास करने की सेटिंग का कोई असर नहीं पड़ता।

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"

स्क्रिप्ट कार्रवाई के बाद Quick Look जोड़ें, ताकि उसकी रिपोर्ट देख सकें। Apple परीक्षण के दौरान Quick Look जोड़ने की खास सलाह देता है, ताकि यह देखा जा सके कि कार्रवाइयों के बीच कौन-सी सामग्री जा रही है। देखें Mac पर Shortcuts में अपनी कार्रवाइयों का परीक्षण करना।

रिपोर्ट में पूरे हुए स्थानांतरणों का वर्णन करने वाला टेक्स्ट होता है। यह स्थानांतरित File ऑब्जेक्ट की सूची नहीं है। यदि आप बाद में शॉर्टकट का विस्तार करें, तो इन रिपोर्ट पंक्तियों को फ़ाइल इनपुट न मानें। Apple दस्तावेज़ देता है कि कार्रवाइयाँ खास तरह की सामग्री स्वीकार करती हैं और आउटपुट देती हैं; किसी कार्रवाई के स्वीकार्य इनपुट और उससे मिलने वाले आउटपुट को देखने के लिए Show Info का उपयोग करें। देखें Mac पर Shortcuts में कार्रवाइयों के कनेक्शन।

नामकरण का नियम दोनों प्रतियाँ कैसे सुरक्षित रखता है?

हर स्रोत फ़ाइल के लिए, स्क्रिप्ट पहले गंतव्य का मूल पथ जाँचती है। यदि वह पथ पहले से इस्तेमाल में है, तो यह (2), फिर (3) आज़माती है और तब तक जारी रखती है जब तक कोई संभावित नाम खाली न मिले। मौजूदा फ़ोल्डर और प्रतीकात्मक लिंक भी इस्तेमाल में मौजूद नाम माने जाते हैं। Apple के mv(1) दस्तावेज़ के अनुसार, अंतिम स्थानांतरण में अतिरिक्त ओवरराइट-जाँच के लिए mv -n का उपयोग होता है।

आने वाली फ़ाइल गंतव्य में पहले से मौजूद चुना गया गंतव्य नाम
notes.txt उस नाम की कोई फ़ाइल नहीं 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

ये प्रोग्राम के नामकरण नियम हैं, Finder के स्वचालित नामकरण के बारे में दावा नहीं। केवल अंतिम एक्सटेंशन अलग किया जाता है: archive.tar (2).gz के अंत में .gz बना रहता है। notes (2).txt नाम वाली आने वाली फ़ाइल का वही आधार नाम बना रहता है; ज़रूरत पड़ने पर उसका नाम notes (2) (2).txt हो जाता है। स्क्रिप्ट किसी मौजूदा संख्या को संस्करण नहीं मानती।

प्रोग्राम पथों को कोट करता है और टेक्स्ट सूची को बाँटने के बजाय शेल द्वारा विस्तारित फ़ाइल नामों पर काम करता है। इसलिए जिन नामों में रिक्त स्थान हैं, वे एक ही आइटम बने रहते हैं। इसका सिंटैक्स जानबूझकर Bash में लिखा गया है; /bin/bash चुना रहने दें। Apple का शेल स्क्रिप्ट के मूल सिद्धांत बताता है कि शेल के अलग-अलग रूपों में अंतर क्यों मायने रखता है।

उदाहरण चलाएँ और नतीजे की जाँच करें

शॉर्टकट एक बार चलाएँ, फिर Finder में दोनों फ़ोल्डर देखें। दिए गए कृत्रिम डेटा के लिए गंतव्य में ये फ़ाइलें अपेक्षित हैं:

  • notes.txt, जिसमें Existing synthetic notes. बना रहेगा।
  • notes (2).txt, जिसमें Earlier synthetic second copy. बना रहेगा।
  • notes (3).txt, जिसमें Incoming synthetic notes. होगा।
  • readme.txt, जिसमें Synthetic readme. होगा।

Incoming फ़ोल्डर अब खाली होना चाहिए और रिपोर्ट का अंत Completed: 2 file(s) moved. से होना चाहिए। फ़ाइलें जोड़े बिना शॉर्टकट फिर चलाने पर शून्य स्थानांतरणों की रिपोर्ट आनी चाहिए। ये इस उदाहरण के अपेक्षित नतीजे हैं; इस लेख को तैयार करते समय macOS Shortcuts का पूरा कार्यप्रवाह चलाया नहीं गया था। फ़ाइल नाम बाँटने वाले एक्सप्रेशन को कृत्रिम नामों के साथ अलग से जाँचा गया था।

यदि शॉर्टकट रुक जाए, तो दोबारा चलाने से पहले दोनों फ़ोल्डर जाँचें। हर फ़ाइल अलग-अलग ले जाई जाती है, इसलिए बाद की फ़ाइल पर आई त्रुटि पहले के स्थानांतरणों को वापस नहीं करती। स्क्रिप्ट यह मानने के बजाय कि हर कमांड पूरा होने का मतलब फ़ाइल का स्थानांतरण हो गया, हर कमांड के बाद जाँचती है कि स्रोत फ़ाइल अब भी मौजूद है या नहीं।

सामान्य स्थानांतरण विफल होने पर, Apple फ़ाइल खुली है या नहीं और गंतव्य में पर्याप्त खाली जगह है या नहीं—यह जाँचने की सलाह देता है। देखें यदि आप Mac पर कोई आइटम नहीं ले जा पा रहे हैं या कॉपी नहीं कर पा रहे हैं। प्रत्यय जोड़ने के बाद फ़ाइल नाम बहुत लंबा हो जाने से भी प्रोग्राम उस फ़ाइल को ले जाने में विफल हो सकता है; यह नाम छोटा करने के बजाय रुक जाता है।

नाम का उपलब्ध होना जाँचने और फ़ाइल ले जाने के बीच दो अलग-अलग कार्रवाइयाँ होती हैं। यह प्रोग्राम एक ऐसे स्थानीय कार्यप्रवाह के लिए है जिसे उपयोगकर्ता स्वयं एक बार में चलाता है और जिसमें फ़ोल्डर स्थिर रहते हैं। यह एक ही समय में होने वाले बदलावों से संभावित नामों को सुरक्षित नहीं रखता। उदाहरण वाले फ़ोल्डरों में एक साथ चलने वाले इंस्टेंस और दूसरी प्रक्रियाओं को बदलाव करने से रोकें।

कुछ ही टकराव हों तो Finder का उपयोग करें

छोटे बैच के लिए, आने वाली फ़ाइल को ले जाने से पहले उसका नाम स्पष्ट रूप से बदलें। इस कृत्रिम उदाहरण में Collected देखें, Incoming/notes.txt चुनें, Return दबाएँ, notes (3).txt लिखें और फिर Return दबाएँ। Apple इस नाम बदलने की प्रक्रिया Mac पर फ़ाइलों, फ़ोल्डरों और डिस्क का नाम बदलना में बताता है।

फिर उसी डिस्क पर बदली हुई फ़ाइल को खींचकर Collected में डालें। Apple बताता है कि किसी आइटम को खींचकर फ़ोल्डर में डालने से वह स्थानांतरित होता है, Option दबाए रखने से उसकी कॉपी बनती है और दूसरी डिस्क पर खींचते समय Command दबाए रखने से वह स्थानांतरित होता है। देखें Mac पर फ़ाइलों को फ़ोल्डरों में व्यवस्थित करना। यदि नाम का कोई और टकराव हो, तो स्थानांतरण रद्द करें और कोई दूसरा खाली नाम चुनें।

जब यह अस्थायी उदाहरण आपके Mac पर अपेक्षा के अनुसार काम करे, तो समान स्थितियों वाले स्थानीय फ़ोल्डरों की दूसरी जोड़ी के लिए केवल src_dir और dst_dir बदलें। क्रमांकित नाम वाला लूप और काम पूरा होने की जाँच साथ रखें: खाली नाम चुनने से गंतव्य में दोनों प्रतियाँ सुरक्षित रहती हैं, जबकि नतीजे की जाँच बताती है कि आने वाली फ़ाइल वास्तव में स्थानांतरित हुई या नहीं।

स्रोत