উত্তর:
mv
ডিরেক্টরিগুলি মার্জ বা ওভাররাইট করতে পারে না, এটি "এমভি: 'এ' থেকে 'বি' তে স্থানান্তরিত করতে পারে না: ডিরেক্টরিটি খালি নয়" বার্তাটি দিয়ে ব্যর্থ হবে , এমনকি আপনি --force
বিকল্পটি ব্যবহার করছেন না কেন ।
আপনি এই ব্যবহার করে অন্যান্য সরঞ্জাম (যেমন চারপাশের কাজ করতে পারেন rsync
, find
অথবা এমনকি cp
), কিন্তু আপনাকে যত্নসহকারে প্রভাব বিবেচনা করা প্রয়োজন:
rsync
একটি ডিরেক্টরিতে থাকা সামগ্রীর সামগ্রীটিকে অন্যটিতে মার্জ করতে পারে ( কেবলমাত্র সেই উত্স ফাইলগুলি নিরাপদে মুছে ফেলার জন্য নিরাপদে মুছে ফেলার জন্য --remove-source-files
1 বিকল্পের সাথে আদর্শভাবে এবং -a
যদি আপনি চান তবে সাধারণ অনুমতি / মালিকানা / সময় সংরক্ষণের বিকল্প সহ ) rsync
এর --link-dest=DIR
বিকল্প এবং (কপি ফাইল বিষয়বস্তু, যেখানে সম্ভব পরিবর্তে hardlinks তৈরী করা) --remove-source-files
একটি শব্দার্থিক খুব নিয়মিত অনুরূপ পেতে mv
। --link-dest
একটি নিখুঁত পথ দেওয়া দরকার ।
… তবে এটি অযৌক্তিক উপায়ে ব্যবহার করা হচ্ছে (যা জটিলতা সৃষ্টি করতে পারে বা নাও পারে), উত্সটির পরম পথ (বা যুক্তি হিসাবে) জানতে (বা নির্ধারণ করা ) দরকার, এবং আবার খালি ডিরেক্টরি কাঠামোটিকে পরিষ্কার করার জন্য ছেড়ে দেয় প্রতি 1 ।--link-dest
--link-dest
find
টার্গেটে উত্স ডিরেক্টরি কাঠামোটি ক্রমিকভাবে পুনরায় তৈরি করতে ব্যবহার করতে পারেন , তারপরে স্বতন্ত্র ফাইলগুলি স্বতন্ত্রভাবে সরান cp
হার্ড লিঙ্কগুলি তৈরি করতে পারে (সহজভাবে বলা যায়, একই বিদ্যমান ফাইলে অতিরিক্ত পয়েন্টার), যা মার্জ করার অনুরূপ ফলাফল তৈরি করে mv
(এবং কেবলমাত্র পয়েন্টার তৈরি হওয়ার কারণে এবং কোনও সত্যিকারের ডেটা অনুলিপি করতে হয় না বলে এটি খুব আইও-দক্ষ) এগুলির মধ্যে কোনটি কার্যকর (যদি থাকে) উপযুক্ত তবে আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে খুব বেশি নির্ভর করবে।
বরাবরের মতো, এই কমান্ডগুলির কোনও প্রয়োগ করার আগে ভাবুন এবং ব্যাকআপ রাখুন।
1: নোট যে rsync --remove-source-files
কোনও ডিরেক্টরি মুছে ফেলবে না, তাই আপনাকে find -depth -type d -empty -delete
খালি উত্স ডিরেক্টরি ট্রি থেকে পরিত্রাণ পেতে এর মতো কিছু করতে হবে ।
mv
ডিবিয়ান দ্বারা ব্যবহৃত বাস্তবায়ন চেষ্টা করেছি - জোর দেওয়া হচ্ছে বলে চেষ্টা করা হয়েছে , যেহেতু
--delete
কেবল ফাইলগুলি মুছে ফেলা হয় যা উত্স ডিরেক্টরিতে নেই।
-H
ফাংশনটির সাথে হার্ড লিঙ্কগুলি সংরক্ষণ করতে পারেন বা আপনি ব্যবহার করে গন্তব্যস্থলে ফাইলগুলিকে লিঙ্ক করতে পারেন --link-dest
। ম্যান পৃষ্ঠাটি তাদের ব্যবহার করার আগে দেখুন।
rsync -av /source/ /destination/
(after checking)
rm -rf /source/
--remove-source-files
সাফল্যের সাথে স্থানান্তরিত হওয়া ফাইলগুলি সরিয়ে ফেলার সুবিধা রয়েছে, তাই আপনি find
খালি ডিরেক্টরিগুলি মুছে ফেলার জন্য ব্যবহার করতে পারেন এবং rsync
এস আউটপুট যাচাই না করে স্থানান্তরিত হয়নি এমন সমস্ত কিছু রেখে দেওয়া হবে ।
আপনি সিপি কমান্ডের -l
বিকল্পটি ব্যবহার করতে পারেন , যা সম্পূর্ণ ডাটা কপির পরিবর্তে একই ফাইল সিস্টেমে ফাইলের হার্ড লিঙ্ক তৈরি করে। নিম্নলিখিত কমান্ডটি ফোল্ডারটিকে প্যারেন্ট ফোল্ডারে অনুলিপি করে ( ) ইতিমধ্যে নামের সাথে একটি ডিরেক্টরি রয়েছে ।source/folder
destination
folder
cp -rl source/folder destination
rm -r source/folder
এছাড়াও আপনি ব্যবহার করতে পারেন -P
( --no-dereference
বা - ডি রেফারেন্স সিম্বলিক লিংক না) -a
( --archive
-, সব মেটাডেটা সংরক্ষণ এছাড়াও অন্তর্ভুক্ত -P
আপনার চাহিদার উপর নির্ভর বিকল্প)।
cp
বদলে rsync
যেহেতু প্রত্যেক সিস্টেম আছে cp
সবাই এটা সঙ্গে পরিচিত এবং।
cp
অপারেশন সময়ের সাথে একত্রীকরণের ক্ষমতা পান mv
।
-n
mv /fs1/file /fs2/
(ফাইল সিস্টেম জুড়ে) একটি অনুলিপি এবং তারপরে একটি মুছুন সম্পাদন করবে।
mv
কাজ করার সময় (লক্ষ্যমাত্রা dir এখনও উপস্থিত না থাকলেও) "দক্ষতার সাথে" না থাকলে বা যা আপনি এটি কল করুন cp -rl
ব্যর্থ হবে।
আমি এই চারটি পদক্ষেপের সুপারিশ করব:
cd ${SOURCE};
find . -type d -exec mkdir -p ${DEST}/\{} \;
find . -type f -exec mv \{} ${DEST}/\{} \;
find . -type d -empty -delete
বা আরও ভাল, এখানে একটি স্ক্রিপ্ট যা শব্দার্থকগুলির অনুরূপ প্রয়োগ করে mv
:
#!/bin/bash
DEST="${@:${#@}}"
ABS_DEST="$(cd "$(dirname "$DEST")"; pwd)/$(basename "$DEST")"
for SRC in ${@:1:$((${#@} -1))}; do (
cd "$SRC";
find . -type d -exec mkdir -p "${ABS_DEST}"/\{} \;
find . -type f -exec mv \{} "${ABS_DEST}"/\{} \;
find . -type d -empty -delete
) done
rsync -u
(নতুন হলে আপডেট করুন) করতে চান, mv
(কিছু সংস্করণে অন্তত) -u
বিকল্পটিও নিতে পারে । তবে সেক্ষেত্রে আপনি উত্স গাছের ফাইলগুলি আরও নতুন নয় এমন ক্ষেত্রে কভার করতে নন-শূন্য উত্স ডিরেক্টরিগুলি পাশাপাশি খালিগুলি মুছতে চান। @ স্পুয়েস: দেখে মনে হচ্ছে একাধিক উত্স উত্স হতে পারে, যদি আপনার প্রয়োজন হয়।
এখানে ডিরেক্টরিগুলি একত্রিত করার উপায় রয়েছে। এটি আরএসসিঙ্কের চেয়ে অনেক দ্রুততর কারণ এটি কেবল ফাইলগুলি অনুলিপি করার পরিবর্তে নাম পরিবর্তন করে সেগুলি মুছে ফেলা হয়।
cd source; find -type f -print0 | xargs -0 -n 1 -I {} mv '{}' 'dest/{}'
dest
ইতিমধ্যে যদি একই নামের মতো ডিরেক্টরি থাকে তবে কমান্ডটি ব্যর্থ হবে source
। এবং ফাইলগুলি একটিতে সরানো হবে dest
, যা রয়েছে source
। কমান্ডটি এর চেয়ে বেশি কিছু করে নাmv source/* source/dest/.
এটি সম্পাদন করার একটি উপায় হ'ল ব্যবহার করা:
mv folder/* directory/folder/
rmdir folder
যতক্ষণ না দুটি ফাইলের একই নাম থাকে folder
এবং ততক্ষণ directory/folder
আপনি একই ফলাফল অর্জন করবেন অর্থাত্ মার্জ করা।
rm folder
কাজ করে?
rm folder -fR
সর্বদা আমার জন্য কাজ করে
শুদ্ধতম অনুলিপিগুলির জন্য, আমি টার (-) বি ব্লকরেড অনুলিপি পদ্ধতি ব্যবহার করি।
উদাহরণস্বরূপ, উত্স পথের মধ্যে থেকে (সেখানে প্রয়োজনে 'সিডি'):
tar cBf - <sourcefolder> | (cd /your/target/folder ; tar xBf -)
এটি উত্স গাছের সঠিক অনুলিপি তৈরি করে, মালিকের সাথে এবং অনুমতিগুলি অক্ষত int এবং যদি লক্ষ্য ফোল্ডারটি বিদ্যমান থাকে তবে ডেটা একত্রিত করা হবে। ইতিমধ্যে বিদ্যমান ফাইলগুলি ওভাররাইট করা হবে।
উদাহরণ:
$ cd /data1/home
$ tar cBf - jdoe | (cd /data2/home ; tar xBf -)
কপির অ্যাকশনটি সফল হলে আপনি উত্সটি ( rm -rf <source>
) সরাতে পারেন । অবশ্যই এটি কোনও সঠিক পদক্ষেপ নয়: আপনি উত্সটি সরিয়ে না দেওয়া পর্যন্ত ডেটা অনুলিপি করা হবে।
বিকল্প হিসাবে আপনি ভার্বোজ হতে পারেন (ফাইলটি অনুলিপি করা হচ্ছে এমন স্ক্রিনে প্রদর্শিত হবে), -v সহ: tar cBvf -
c
: সৃষ্টিB
: সম্পূর্ণ ব্লক পড়ুন (পাইপ পড়ার জন্য)v
: ক্রিয়াপদf
: লিখতে ফাইলx
: নির্যাস-
: stdout / stdinsourcefolder
*
(বর্তমান ফোল্ডারের কোনও কিছুর জন্য ) ও হতে পারে
f -
সাধারণত অপ্রয়োজনীয় - ডিফল্টটি স্ট্যান্ডিন / স্টাডআউট থেকে লেখার জন্য পড়তে হয়।
এখানে একটি স্ক্রিপ্ট আমার জন্য কাজ করেছে। আমি আরএসসিএনসি এর চেয়ে এমভি পছন্দ করি তাই আমি জুয়েল এবং জোনাথন মায়ারের সমাধানগুলি ব্যবহার করি।
#!/bin/bash
# usage source1 .. sourceN dest
length=$(($#-1))
sources=${@:1:$length}
DEST=$(readlink -f ${!#})
for SRC in $sources; do
pushd $SRC;
find . -type d -exec mkdir -p ${DEST}/{} \;
find . -type f -exec mv {} ${DEST}/{} \;
find . -type d -empty -delete
popd
done
সিপি বা আরএসএনসি-র মতো কমান্ড ব্যবহার করা ভাল ধারণা নয়। বড় ফাইলগুলির জন্য, এটি একটি দীর্ঘ সময় নিতে হবে। এমভি আরও দ্রুততর হয় যেহেতু এটি শারীরিকভাবে ফাইলগুলি অনুলিপি না করে কেবল ইনডগুলি আপডেট করে। আপনার অপারেটিং সিস্টেমের ফাইল ম্যানেজার ব্যবহার করা আরও ভাল বিকল্প। ওপেনসুজের জন্য কনকেরার নামে একটি ফাইল ম্যানেজার রয়েছে। এটি ফাইলগুলি অনুলিপি না করেই স্থানান্তর করতে পারে। এটি উইন্ডোজের মতো "কাট এবং পেস্ট" ফাংশন করেছে। ডিরেক্টরি এ-এর সমস্ত উপ-ডিরেক্টরি নির্বাচন করুন ডানদিকে ক্লিক করুন এবং "বিভাজন" ডিরেক্টরি বিতে একই নামের সাব-ডিরেক্টরি থাকতে পারে। এটি তাদের একীভূত করবে। আপনি একই নামের সাথে ফাইলগুলি ওভাররাইট করতে বা পুনরায় নামকরণ করতে চান সেগুলিও বিকল্প রয়েছে।
mv
কী হয়।
পাইথন সমাধান
যেহেতু আমি একটি সন্তুষ্ট প্রাক-বিদ্যমান সমাধানটি খুঁজে পাইনি, তাই আমি এটি অর্জন করার জন্য একটি দ্রুত পাইথন স্ক্রিপ্ট তৈরি করার সিদ্ধান্ত নিয়েছি।
বিশেষত, এই পদ্ধতিটি দক্ষ কারণ এটি কেবল উত্স ফাইল ট্রিটিকে একবার নীচে নেমে গেলে।
এটি আপনাকে নিজের পছন্দ অনুসারে ফাইল ওভাররাইট হ্যান্ডলিংয়ের মতো জিনিসগুলিকে দ্রুত টুইট করার অনুমতি দেবে।
ব্যবহার:
move-merge-dirs src/ dest/
সব বিষয়বস্তু সরানো হবে src/*
মধ্যে dest/
এবং src/
অদৃশ্য হয়ে যাবে।
সরানো-একত্রীকরণ-dirs
#!/usr/bin/env python3
import argparse
import os
def move_merge_dirs(source_root, dest_root):
for path, dirs, files in os.walk(source_root, topdown=False):
dest_dir = os.path.join(
dest_root,
os.path.relpath(path, source_root)
)
if not os.path.exists(dest_dir):
os.makedirs(dest_dir)
for filename in files:
os.rename(
os.path.join(path, filename),
os.path.join(dest_dir, filename)
)
for dirname in dirs:
os.rmdir(os.path.join(path, dirname))
os.rmdir(source_root)
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Move merge src/* into dest. Overwrite existing files.'
)
parser.add_argument('src_dir')
parser.add_argument('dest_dir')
args = parser.parse_args()
move_merge_dirs(args.src_dir, args.dest_dir)
এটি আরও দেখুন: https://stackoverflow.com
ফাইল এবং ফোল্ডারগুলিকে অন্য গন্তব্যে নিয়ে যাওয়ার জন্য এই আদেশটি:
$ mv /source/path/folder /target/destination/
মনে রাখবেন : mv
যদি ফোল্ডার কমান্ড কাজ করবে না মিশে গিয়ে তৈরি হচ্ছে (অর্থাত একই নামের আরেকটি ফোল্ডার ইতিমধ্যে গন্তব্য মধ্যে উপস্থিত) এবং গন্তব্য এক খালি না থাকে ।
এমভি: '/ উত্স / পথ / ফোল্ডার' থেকে '/ টার্গেট / গন্তব্য / ফোল্ডার' এ স্থানান্তরিত করতে পারে না: ডিরেক্টরিটি ফাঁকা নয়
গন্তব্য ফোল্ডারটি খালি থাকলে উপরের কমান্ডটি ঠিকঠাক কাজ করবে।
সুতরাং, উভয় ফোল্ডারটিকে যে কোনও ক্ষেত্রে মার্জ করার জন্য,
হয় এটি 2 কমান্ডে করুন:
$ cp -rf /source/path/folder /target/destination/
$ rm -rf /source/path/folder
অথবা উভয়কে এককালীন কমান্ড হিসাবে একত্রিত করুন:
$ cp -rf /source/path/folder /target/destination/ && rm -rf /source/path/folder
এমভি = সরানো
সিপি = অনুলিপি
আরএম = সরান-r ডিরেক্টরির জন্য (ফোল্ডার)
-f বল ফাঁসি
mv
। এই উত্তরটি বিস্তৃত সত্যের সাথে আরও ভাল। লিনাক্স, বিএসডি এবং "বাস্তব" ইউনিক্স, বা পসিক্স বা এসইএসের একটি রেফারেন্স।