উত্তর:
mv
একটি ফাইল সরানো হয়, এবং ln -s
একটি প্রতীকী লিঙ্ক তৈরি করে, সুতরাং এই দুটি কমান্ড কার্যকর করে একটি স্ক্রিপ্ট দ্বারা প্রাথমিক কাজটি সম্পন্ন করা হয়:
#!/bin/sh
mv -- "$1" "$2"
ln -s -- "$2" "$1"
কয়েকটি ক্যাভেট রয়েছে। দ্বিতীয় আর্গুমেন্ট যদি ডিরেক্টরি হয় তবে mv
ফাইলটি সেই ডিরেক্টরিতে স্থানান্তরিত করবে, তবে ln -s
স্থানান্তরিত ফাইলের পরিবর্তে ডিরেক্টরিতে একটি লিঙ্ক তৈরি করবে।
#!/bin/sh
set -e
original="$1" target="$2"
if [ -d "$target" ]; then
target="$target/${original##*/}"
fi
mv -- "$original" "$target"
ln -s -- "$target" "$original"
আরেকটি সতর্কতা হ'ল প্রথম যুক্তিটি ln -s
প্রতীকী লিঙ্কের সঠিক পাঠ্য। এটি লক্ষ্যটির অবস্থানের সাথে সম্পর্কিত, কমান্ডটি কার্যকর করা হয় সেই ডিরেক্টরিটির সাথে নয়। যদি আসল অবস্থানটি বর্তমান ডিরেক্টরিতে না থাকে এবং লক্ষ্যটি কোনও নিখুঁত পথ দ্বারা প্রকাশ না করা হয় তবে লিঙ্কটি ভুল হবে। এই ক্ষেত্রে, পথটি নতুন করে লেখা দরকার। এই ক্ষেত্রে, আমি একটি নিখুঁত লিঙ্ক তৈরি করব (একটি আপেক্ষিক লিঙ্কটি পছন্দনীয় হবে তবে সঠিকভাবে পাওয়া শক্ত)। এই স্ক্রিপ্টটি ধরে নিয়েছে যে আপনার কাছে ফাইলের নাম নেই যা একটি নতুন লাইনের অক্ষরে শেষ হয়।
#!/bin/sh
set -e
original="$1" target="$2"
if [ -d "$target" ]; then
target="$target/${original##*/}"
fi
mv -- "$original" "$target"
case "$original" in
*/*)
case "$target" in
/*) :;;
*) target="$(cd -- "$(dirname -- "$target")" && pwd)/${target##*/}"
esac
esac
ln -s -- "$target" "$original"
আপনার যদি একাধিক ফাইল থাকে তবে এগুলি একটি লুপে প্রক্রিয়া করুন।
#!/bin/sh
while [ $# -gt 1 ]; do
eval "target=\${$#}"
original="$1"
if [ -d "$target" ]; then
target="$target/${original##*/}"
fi
mv -- "$original" "$target"
case "$original" in
*/*)
case "$target" in
/*) :;;
*) target="$(cd -- "$(dirname -- "$target")" && pwd)/${target##*/}"
esac
esac
ln -s -- "$target" "$original"
shift
done
rsync --remove-source-files
এমন ব্যবহারকারীদের কাছে আরও তথ্যপূর্ণ হতে পারে যারা একটি বড় ফাইলটিকে একটি ডিস্ক থেকে সরিয়ে ফেলেন যা কিছুটা সময় নিতে পারে।
এটি .sh ফাইলে রাখুন এবং এটি কার্যকর ( chmod +x filename
):
#!/bin/bash
mv "$1" "$2"
ln -s "$2" "$1"
ব্যবহারের উদাহরণ:
./test.sh asdf otherdir/asdf
মনে রাখবেন যে এটির কোনও সুরক্ষা চেক ইত্যাদি নেই your আপনার কাজটি কতটা জটিল তা নির্ভর করে এটি যথেষ্ট।
./test.sh .mozila/firefox/zotero/*/*.pdf MyBbliography/*.pdf
। *
আপনার সাথে কাজ হবে বলে মনে হচ্ছে না test.sh
। আপনি কি একটি কাজ আছে? থেক্স
আমি সাধারণত এই এক-লাইন ফাংশনটি ব্যবহার করি:
function ml() { mkdir -p "$(dirname "$1")" && rsync -aP --no-links "$1" "$2" && ln -sf "$2" "$1" }
ব্যবহার এমভি বা সিপির সমান:
ml old_file target_dir/new_file_name
এটি ভেঙে দেওয়া:
mkdir -p "$(dirname "$1")"
- গন্তব্য ডিরেক্টরিটি ইতিমধ্যে উপস্থিত না থাকলে তৈরি করুন
dirname "$1"
- পথের ডিরেক্টরি উপাদানটি পান (ফাইলের নামটি স্ট্রিপ করুন)rsync -aP --no-links "$1" "$2"
- গন্তব্যে ফাইলটি অনুলিপি করুন। এটি দিয়ে প্রতিস্থাপন করুনmv "$1" "$2"
আরও ভাল পারফরম্যান্সের জন্য যদি উভয় ফাইলই একই ফাইল সিস্টেমে থাকে তবে ।
-a
- মালিকানা এবং অন্যান্য সমস্ত অনুমতি সংরক্ষণ করুন। আপনি যে উপাদানগুলি চান তা সংরক্ষণ করতে আপনি এটি টিউন করতে পারেন।-P
- অগ্রগতি দেখান।--no-links
- লিঙ্কগুলি অনুলিপি করবেন না - এর অর্থ আপনি একই কমান্ডটি একই ফাইলটিতে যতবার চান চালাতে পারবেন এবং আপনি নিজের গন্তব্য ফাইলটি নিজেই একটি সিমলিংক দিয়ে ওভাররাইট করে নিজের ফাইলটি হারাবেন না।ln -sf "$2" "$1"
- নতুন ফাইলটিতে একটি সিমিলিংক দিয়ে পুরানো ফাইলটি ওভাররাইট করুন
-s
- প্রতীকী লিঙ্ক ব্যবহার করুন-f
- পুরানো ফাইলটি ওভাররাইট করুন