সর্বাধিক সরল পদ্ধতি হল ফাইলের নামগুলি রূপান্তর করতে ফাইল সিস্টেম স্তরটি উত্তোলন করা। উবুন্টু 12.04 সাল থেকে, এখানে একটি ফুস ফাইল সিস্টেম রয়েছে যা ফাইলের নামগুলিকে নামগুলিতে রূপান্তর করে যা উইন্ডোজ এর ভিএফএটি সমর্থন করে: ফিউজ-পিক্সিকোভাল ।
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)
।
সাবধান হন যে পসিআইক্সভল ফাইলগুলির নামগুলি যে খুব দীর্ঘ with যদি এনকোড করা নামটি 255 টি অক্ষরে ফিট না করে তবে ফাইলটি সংরক্ষণ করা যাবে না।
POSIXovl কল করা ফাইলগুলিতে ইউনিক্স অনুমতি এবং মালিকানা সঞ্চয় করে .pxovl.FILENAME
।
নিম্নলিখিত বাশ ≥4 লিপিটি অনুলিপি ~/mail/foo:bar
করে /media/usb99/mail/foo_bar
এবং একইভাবে সমস্ত ফাইলের অধীনে ~/mail
। গন্তব্য গাছটিতে ইতিমধ্যে বিদ্যমান ফাইলগুলি এবং উত্সের চেয়ে পুরানো নয় যেগুলি এড়িয়ে যায় are
#!/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 ]]
।
এখানে একটি জেডএস টু-লাইনার (তিনটি যদি আপনি অটোলোডগুলি গণনা করেন)। এটি খাটো, তবে মোটামুটি উন্নত এবং খুব পাঠযোগ্য নয়।
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/**/*(…)
ছাড়া এটি বোমা মেরে না যদি ডিরেক্টরির নাম ক্রমযোজিত দৈর্ঘ্য অত্যন্ত দীর্ঘ। যে লাইনটি প্রয়োজনীয় ডিরেক্টরিগুলি তৈরি করে।
~/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/