सबसे सरल दृष्टिकोण फ़ाइल नामों को बदलने के लिए फाइल सिस्टम परत का लाभ उठाना है। Ubuntu 12.04 के बाद से, एक FUSE फाइल सिस्टम है जो फ़ाइल नामों को उन नामों में परिवर्तित करता है जो विंडोज के VFAT का समर्थन करता है: फ्यूज-पॉज़िक्सॉवल ।
sudo mount.posixovl /media/sdb1
chown guillaume /media/sdb1
rsync -au ~/mail /media/sbd1/
या रूट एक्सेस की आवश्यकता से बचने के लिए:
mkdir ~/mnt
/sbin/mount.posixovl -S /media/sdb1 ~/mnt
rsync -au ~/mail ~/mnt/
फ़ाइल नाम है कि VFAT स्वीकार नहीं करता है में पात्रों के रूप में इनकोड %(XX)
जहां XX
हेक्साडेसिमल अंक हैं। POSIXovl 1.2.20120215 के अनुसार, सावधान रहें कि जैसे कोई फ़ाइल नाम %(3A)
स्वयं के रूप में एन्कोड किया गया है, और के रूप में डीकोड किया जाएगा :
, इसलिए यदि आपके पास फ़ॉर्म के सबस्ट्रिंग वाले फ़ाइल नाम हैं तो टकराव का जोखिम है %(XX)
।
खबरदार कि POSIXovl फ़ाइल नामों के साथ सामना नहीं करता है जो बहुत लंबे हैं। यदि एन्कोडेड नाम 255 वर्णों में फिट नहीं है, तो फ़ाइल संग्रहीत नहीं की जा सकती।
POSIXovl नामक फाइलों में यूनिक्स की अनुमति और स्वामित्व संग्रहीत करता है .pxovl.FILENAME
।
निम्न बैश script4 स्क्रिप्ट की प्रतिलिपि बनाता ~/mail/foo:bar
है /media/usb99/mail/foo_bar
, और इसी तरह सभी फाइलों के लिए ~/mail
। गंतव्य ट्री में मौजूद फ़ाइलें और जो स्रोत से पुरानी नहीं हैं, उन्हें छोड़ दिया गया है।
#!/bin/bash
set -e
shopt -s dotglob globstar
for source in "$HOME"/mail/**/*; do
target=/media/usb99/${source#"$HOME"/}
target=${target//:/_}
if [[ -d $source ]]; then
mkdir -p -- "$target"
elif [[ $target -ot $source ]]; then
cp -p -- "$source" "$target"
fi
done
यह स्क्रिप्ट छोटे संशोधनों के साथ zsh के तहत काम करती है: इसके shopt -s dotglob globstar
द्वारा setopt dot_glob
और उसके [[ $target -ot $source ]]
द्वारा प्रतिस्थापित [[ ! -e $target || $target -ot $source ]]
।
यहाँ एक zsh दो-लाइनर है (तीन यदि आप ऑटोलैड की गिनती करते हैं)। यह छोटा है, लेकिन काफी उन्नत है और बहुत पठनीय नहीं है।
autoload zargs zmv
zargs -- ~/mail/**/*(/e\''REPLY=/media/usb99/${${REPLY#$HOME/}//:/_}'\') -- mkdir -p --
zmv -C -Q -o -pu '~/mail/(**/)(*)(.)' '/media/usb99/mail/${1//:/_}${2//:/_}'
zargs
लाइन के बराबर है mkdir -p ~/mail/**/*(…)
सिवाय इसके कि यह बाहर बम नहीं होगा यदि निर्देशिका नाम की Cumulated लंबाई बहुत अधिक कर रहे हैं। यह पंक्ति आवश्यक के रूप में लक्ष्य निर्देशिका बनाती है।
~/mail/**/*(/)
के तहत सभी निर्देशिकाओं का विस्तार करता है ~/mail
(केवल (/)
अंत में होने वाली निर्देशिकाएं )।
(/e\''…'\')
केवल निर्देशिकाओं का चयन करता है और प्रत्येक फ़ाइल नाम को बदलने के लिए '...' के भीतर कोड को निष्पादित करता है, जिसे REPLY
चर में संग्रहीत किया जाता है।
${${REPLY#$HOME/}//:/_}
स्रोत निर्देशिका के साथ उपसर्ग को हटाता है और में बदलता :
है _
।
zmv -C
प्रत्येक फ़ाइल को उसके पहले ऑपरेंड (एक zsh पैटर्न) से मेल करते हुए फ़ाइल नाम को उसके दूसरे ऑपरेंड का विस्तार करके प्राप्त किया।
-o -pu
उपयोगिता को पारित -pu
करने के लिए कहते हैं cp
, ताकि अनुमति को संरक्षित करने के लिए और केवल अद्यतन फ़ाइलों की प्रतिलिपि बनाएँ। (हम अपडेट चेक करने के लिए zsh को बता सकते हैं; यह थोड़ा तेज़ होगा लेकिन और भी अधिक गूढ़ होगा।)
(.)
केवल नियमित फ़ाइलों का चयन करता है। -Q
यह कहता है कि इसे एक ग्लोब क्वालिफायर के रूप में देखा जाना चाहिए, न कि .
इसके चारों ओर कोष्ठक के रूप में ।
$1
और $2
प्रतिस्थापन पाठ में कोष्ठक अभिव्यक्तियों से मेल खाता है (**/)
और *
। ( **
अपने विशेष अर्थ को शून्य या अधिक उप-स्तर के स्तर के रूप में खो देता है यदि यह कोष्ठक में है, जब तक कि कोष्ठक बिल्कुल समाहित न हों **/
।)
मैंने शुरू में पैक्स का उपयोग करने के लिए सोचा था , जो एक संग्रह उपकरण है (यहां पास-थ्रू मोड में उपयोग किए जाने का इरादा है) जिसमें एक फ़ाइल का नाम बदलने की सुविधा (इसका -s
विकल्प) है। हालाँकि, -s
और -u
विकल्प एक साथ काम नहीं करते हैं ( पैक्स की पॉसिक्स परिभाषा शाब्दिक रूप से कहती है कि -u
डेस्टिनेशन ट्री में एक ही नाम की एक फाइल की जांच करनी चाहिए, बजाय इसके कि फ़ाइल नाम बदल दिया गया है -s
; उबंटू में पैक्स का कार्यान्वयन वस्तुतः के बजाय विशेष रूप से कल्पना का अनुसरण करता है ; उपयोगी)। यह अभी भी इसका इस्तेमाल का नाम बदला हार्ड लिंक बनाने के लिए बनाने के लिए संभव है, और उसके बाद हार्ड लिंक (के साथ कॉपी rsync -au
या pax -rw -pp -u
) अन्य मीडिया के लिए, लेकिन यह यह की कीमत की तुलना में अधिक परेशानी महसूस करता है।
cd ~/mail
mkdir -p /media/usb99/mail
pax -rw -l -pp -s '!:!_!g' . ../mail.colonless
rsync -au ../mail.colonless/ /media/usb99/mail/