একটি ফাইল সরান এবং একটি সিমিলিংক দ্বারা এটি প্রতিস্থাপন


16

কেউ কি আমাকে একটি আদেশ দিতে পারে যা করতে পারে:

  • একটি নতুন ডিরেক্টরিতে একটি ফাইল সরান
  • এবং তার নতুনটির দিকে পুরানো স্থানে একটি সিমিলিংক রেখে দিন

উত্তর:


19

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

1
স্ক্রিপ্ট এবং ব্যাখ্যাগুলির জন্য গিলসকে ধন্যবাদ জানাই। আমি তা বোঝার চেষ্টা করব!
ইয়ো বি।

এটি সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত
শ্রীধর সারনোবাত

এই উত্তরটিকে আরও ভয়ঙ্কর করে তুলতে, rsync --remove-source-filesএমন ব্যবহারকারীদের কাছে আরও তথ্যপূর্ণ হতে পারে যারা একটি বড় ফাইলটিকে একটি ডিস্ক থেকে সরিয়ে ফেলেন যা কিছুটা সময় নিতে পারে।
শ্রীধর সারনোবাত

আমার মনে হয় আপনার সাথে sh কল করা উচিত-সুতরাং এটির ত্রুটিগুলি ভেঙে যায়, উদাহরণস্বরূপ আপনি যদি এমভি কমান্ডটি বন্ধ করেন কারণ একটি ফাইল ইতিমধ্যে বিদ্যমান রয়েছে
অ্যালেক্স

2

এটি .sh ফাইলে রাখুন এবং এটি কার্যকর ( chmod +x filename):

#!/bin/bash

mv "$1" "$2"
ln -s "$2" "$1"

ব্যবহারের উদাহরণ:

./test.sh asdf otherdir/asdf

মনে রাখবেন যে এটির কোনও সুরক্ষা চেক ইত্যাদি নেই your আপনার কাজটি কতটা জটিল তা নির্ভর করে এটি যথেষ্ট।


আপনাকে ম্যাথিউ ধন্যবাদ, একটি ফাইলে প্রয়োগ করার সময় এটি পুরোপুরি কাজ করে। কিন্তু আপনি সাহায্য করতে পারেন আমাকে এভাবে দুই ডিরেক্টরি এই generalising: ./test.sh .mozila/firefox/zotero/*/*.pdf MyBbliography/*.pdf*আপনার সাথে কাজ হবে বলে মনে হচ্ছে না test.sh। আপনি কি একটি কাজ আছে? থেক্স
ইও বি।

2
@ কাদোক ম্যাথিউ রকের স্ক্রিপ্টটি কেবল একটি একক ফাইলের জন্য কাজ করে এবং লক্ষ্যটি অবশ্যই একটি চূড়ান্ত পথ হতে পারে অন্যথায় উত্সটি অবশ্যই বর্তমান ডিরেক্টরিতে থাকা উচিত।
গিলস 21

এছাড়াও, যদি $ 1 ফাইল হয় তবে work 2 ডিরেক্টরি হয় তবে এটি কাজ করবে না।
শ্রীধর সারনোবাত

0

আমি সাধারণত এই এক-লাইন ফাংশনটি ব্যবহার করি:

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 - পুরানো ফাইলটি ওভাররাইট করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.