जवाबों:
mv
निर्देशिकाओं को मर्ज या अधिलेखित नहीं कर सकते, यह "mv:" a 'को' b 'में नहीं ले जा सकता: संदेश को खाली नहीं कर सकता "निर्देशिका खाली नहीं है , तब भी जब आप --force
विकल्प का उपयोग कर रहे हों ।
आप इस का उपयोग करते हुए अन्य उपकरणों (जैसे आस-पास काम कर सकते हैं rsync
, find
या यहां तक कि cp
), लेकिन आप ध्यान से प्रभाव पर विचार करने की जरूरत है:
rsync
एक निर्देशिका की सामग्री को दूसरे में विलय कर सकते हैं (आदर्श रूप से --remove-source-files
1 विकल्प के साथ केवल उन स्रोत फ़ाइलों को सुरक्षित रूप से हटाने के लिए जिन्हें सफलतापूर्वक स्थानांतरित किया गया था, और -a
यदि आप चाहें तो सामान्य अनुमति / स्वामित्व / समय संरक्षण विकल्प के साथ rsync
के --link-dest=DIR
विकल्प और (को कॉपी फ़ाइल सामग्री, जहां संभव के बजाय hardlinks बनाने के लिए) --remove-source-files
एक अर्थ बहुत एक नियमित रूप से करने के लिए इसी तरह की प्राप्त करने के लिए mv
। --link-dest
लिए स्रोत निर्देशिका (या गंतव्य से स्रोत के लिए एक रिश्तेदार पथ ) को एक पूर्ण पथ दिया जाना चाहिए । --link-dest
अनपेक्षित तरीके से उपयोग किया जा रहा है (जो जटिलताओं का कारण हो सकता है या नहीं भी हो सकता है), स्रोत के लिए निरपेक्ष पथ को जानने (या निर्धारित करने) की आवश्यकता है (एक तर्क के रूप में --link-dest
), और फिर से खाली निर्देशिका संरचना को साफ करने के लिए छोड़ देता है। प्रति 1 ।find
लक्ष्य पर स्रोत निर्देशिका संरचना को क्रमिक रूप से पुन: उपयोग करने के लिए उपयोग कर सकते हैं , फिर व्यक्तिगत रूप से वास्तविक फ़ाइलों को स्थानांतरित कर सकते हैं cp
हार्ड लिंक बना सकते हैं (बस उसी मौजूदा फ़ाइल के लिए अतिरिक्त संकेत), जो एक विलय के समान परिणाम बनाता है mv
(और केवल बिंदु बनाए जाने के बाद से बहुत ही IO- कुशल है और कोई वास्तविक डेटा कॉपी नहीं किया जाना चाहिए) इनमें से कौन सा वर्कअराउंड (यदि कोई है) उपयुक्त है तो यह आपके विशिष्ट उपयोग के मामले पर बहुत निर्भर करेगा।
हमेशा की तरह, इनमें से किसी भी कमांड को निष्पादित करने से पहले सोचें, और बैकअप लें।
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
s जाँच के स्थानांतरित नहीं किया गया था ।
आप cp कमांड के -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
तक "कुशलता से" (जो लक्ष्य अभी तक मौजूद नहीं है, बशर्ते कि) "कुशलतापूर्वक" या जिसे आप इसे कहते हैं, 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
विकल्प ले सकते हैं । हालाँकि, उस स्थिति में आप गैर-रिक्त स्रोत निर्देशिकाओं को हटाना चाहते हैं और साथ ही खाली भी कर सकते हैं, उन मामलों को कवर करने के लिए जहां स्रोत के पेड़ की फाइलें नई नहीं हैं। @ शुक्राणु: ऐसा लगता है कि यदि आवश्यक हो तो कई स्रोत तर्क हो सकते हैं।
यहां एक तरीका है जो निर्देशिकाओं को मर्ज करेगा। यह rsync की तुलना में बहुत तेज़ है क्योंकि यह फ़ाइलों को कॉपी करने के बजाय केवल उनका नाम बदल देता है और फिर उन्हें हटा देता है।
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 -)
यह मालिक और अनुमतियों के साथ स्रोत पेड़ की एक सटीक प्रतिलिपि बनाता है। और यदि लक्ष्य फ़ोल्डर मौजूद है, तो डेटा विलय कर दिया जाएगा। केवल पहले से मौजूद फ़ाइलों को अधिलेखित कर दिया जाएगा।
उदाहरण:
$ cd /data1/home
$ tar cBf - jdoe | (cd /data2/home ; tar xBf -)
जब प्रतिलिपि कार्रवाई सफल होती है, तो आप स्रोत ( rm -rf <source>
) हटा सकते हैं । बेशक यह एक सटीक कदम नहीं है: डेटा को कॉपी किया जाएगा, जब तक आप स्रोत को हटा नहीं देते।
विकल्प के रूप में आप वर्बोज़ हो सकते हैं (स्क्रीन पर फ़ाइल की प्रतिलिपि बनाई जा रही है), -v के साथ: tar cBvf -
c
: सृजन करनाB
: पूरा ब्लॉक पढ़ें (पाइप रीड के लिए)v
: क्रियाf
: लिखने के लिए फ़ाइलx
: अर्क-
: स्टडआउट / स्टडिनsourcefolder
भी हो सकता है *
(वर्तमान फ़ोल्डर में कुछ के लिए)
f -
टार को निर्दिष्ट करना आमतौर पर अनावश्यक है - डिफ़ॉल्ट को स्टडिन से पढ़ना / लिखना है जो स्टडआउट के लिए है।
यहाँ एक स्क्रिप्ट है जो मेरे लिए काम करती है। मैं rsync पर mv पसंद करता हूं, इसलिए मैं गहना और जोनाथन मेयर के समाधान का उपयोग करता हूं।
#!/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
Cp या rsync जैसी कमांड का उपयोग करना एक अच्छा विचार नहीं है। बड़ी फ़ाइलों के लिए, इसमें लंबा समय लगेगा। mv बहुत तेज है क्योंकि यह केवल शारीरिक रूप से फाइलों को कॉपी किए बिना इनोड्स को अपडेट करता है। एक बेहतर विकल्प अपने ऑपरेटिंग सिस्टम के फ़ाइल प्रबंधक का उपयोग करना है। Opensuse के लिए, एक फ़ाइल प्रबंधक है जिसे Konquerer कहा जाता है। यह वास्तव में उन्हें कॉपी किए बिना फ़ाइलों को स्थानांतरित कर सकता है। इसमें विंडोज की तरह "कट एंड पेस्ट" फंक्शन है। बस निर्देशिका ए में सभी उप-निर्देशिकाओं का चयन करें और एक ही नाम के साथ उप-निर्देशिकाओं को शामिल करने वाली "निर्देशिका बी" पर क्लिक करें। यह उन्हें मर्ज कर देगा। ऐसे विकल्प भी हैं कि क्या आप एक ही नाम वाली फाइलों को अधिलेखित या नाम बदलना चाहते हैं।
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/questions/22588225/how-do-you-merge-two-directories-or-move-with-replace-from-the-windows-command
यह फ़ाइलों और फ़ोल्डरों को अन्य गंतव्य पर ले जाने के लिए कमांड है:
$ mv /source/path/folder /target/destination/
याद रखें : mv
यदि फ़ोल्डर b commande̲i̲n̲g m̲e willr̲ge̲d folder (यानी एक ही नाम वाला दूसरा फ़ोल्डर पहले से ही गंतव्य में मौजूद है) और d̲e̲s̲t̲i̲n̲n̲t̲i̲o̲n̲ o̲n̲e̲ i̲s̲ n̲o̲t̲t workt work काम नहीं करेगा ।
mv: '/ source / path / folder' को '/ target / डेस्टिनेशन / फोल्डर' में नहीं ले जा सकता है: डायरेक्टरी खाली नहीं है
यदि गंतव्य फ़ोल्डर खाली है, तो उपरोक्त आदेश ठीक काम करेगा।
तो, किसी भी मामले में दोनों फ़ोल्डरों को मर्ज करने के लिए,
या तो इसे 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
mv = move
cp = copy
rm = removeनिर्देशिका के लिए -r (फ़ोल्डर)
-f बल निष्पादन
mv
। यह उत्तर एक व्यापक सत्य के साथ बेहतर होगा। लिनक्स, बीएसडी और "वास्तविक" यूनिक्स, या पोसिक्स या एसयूएस से एक संदर्भ।