سؤال ماذا يحدث إذا توقفت mv؟


ماذا يحدث لو كان لينكس mv تمت مقاطعة الأمر؟ لنفترض أنني أنقل دليلًا كاملاً إلى مكان آخر وأقاطعه أثناء تحركه. هل سيظل دليل المصدر غير مسهل؟


69
2018-03-18 09:25


الأصل




الأجوبة:


إذا قمت بنقل دليل على نفس نظام الملفات يمكنك فقط نقل إدخال الدليل من موقع واحد في نظام الملفات إلى موقع آخر. مثلا mv /source/dir /target/dir سيحذف إدخال الدليل من dir من عند /source وإنشاء واحد جديد فيه /target. يتم ذلك عن طريق استدعاء نظام ذري واحد (بمعنى أنه غير قابل للانقطاع). ال inode تحتوي على إدخالات الدليل من dir وكذلك لا يتأثر المحتوى الفعلي للدليل نفسه.

إذا قمت بنقل الدليل من نظام ملفات إلى آخر يتم نقل الملفات واحد تلو الآخر (كما يذكر Ignacio في إجابته) ، أي إذا كنت تقاطع mv تتم إزالة الملفات المنقولة بالفعل من الدليل المصدر.


49
2018-03-18 09:54



@ ويسلي: لا ، لن يكون هناك ملف جزئي. إذا استمر النظام في العمل (على سبيل المثال ، أنت تضغط على ctrl-C) ، فستتم إزالته تلقائيًا. إذا لم يكن ذلك (على سبيل المثال ، فقد الطاقة) ، فقد يتم ترك الملف الجزئي في مكان ما غير ممكن الوصول إليه على القرص الوجهة ، ولكن يجب تنظيفه من خلال التالي fsck (على الأرجح سيتم تشغيله تلقائيًا عند إعادة التشغيل ، نظرًا لأن القرص لم يتم إلغاء تركيبه بشكل سليم). - Dave Sherohman
خطأ. إذا قمت بنقل dir من fs إلى mv / fs1 / dir / fs2 / وأنت تقاطع ، / fs1 / dir / ستبقى هنا تمامًا. تتم إزالة / fs1 / dir فقط عند اكتمال النقل.
user263131 هو الصحيح. يركض strace mv /fs1/dir /fs2/ - ال آخر شيء mv لا تدعو unlinkat على جميع ملفات المصدر في وقت واحد (وليس واحدا تلو الآخر كما يتم نسخها). - Jakob
لقد جئت إلى هنا بعد مقاطعة "mv /fs1/*.data / fs2". يتم حذف ملفات البيانات في fs1 التي تم نسخها بالكامل إلى fs2 ، مشيرة إلى أنها تتم على أساس لكل ملف كما هو مذكور في bmk. ربما تكون الدلائل حالة خاصة ، حيث لا يمكنك حذفها حتى يتم إخراج جميع الأشياء الموجودة بها. - J.J
@ J.J يبدو مثل هذا لأنك استخدمت توسعة bash ، وفي هذه الحالة تعامل mv كل ملف في التوسيع كمصدر منفصل (وبالتالي القيام به بشكل فردي). - gkanwar


يتكرر تنفيذ جنو على الوسيطات الموجودة في سطر الأوامر ، ويحاول إعادة تسميته أولاً ، وإذا فشل ذلك ، فسيقوم بالتكرار ثم يحذف المصدر بشكل متكرر. وبالتالي

mv a b c/

سيتم حذف ا قبل النسخ بولن تبدأ في حذف أي شيء فيها ا قبل اكتمال نسخة الوجهة.

لاحظ أن هذا ينطبق على تطبيق جنو فقط.

للتوضيح: إذا ا هو دليل يحتوي على د و البريدو ب هو ملف ، سيكون الطلب

  • خلق ج / أ
  • نسخ a / d -> c / a / d
  • نسخة a / e -> c / a / e
  • احذف a / d
  • حذف / ه
  • حذف
  • نسخة ب -> ج / ب
  • حذف ب

28
2018-03-18 13:18



هل يمكنك تقديم مصدر لهذا؟ تقول المجيبون الآخرون أن الملف المصدر يتم حذفه فورًا بعد نسخه إلى fs مختلف (بمعنى أنه لا يتم نسخ كل ما تم حذفه بعد ذلك). - Puddingfox
تجربة. لقد أضفت مثالًا لجعله أكثر وضوحًا في كيفية توافق إجابتي والآخرين. إذا قمت فقط بإدراج ملفات فردية ، فسيتم حذف كل ملف على الفور. - Simon Richter


يمكنك نقل دليل واحد ، مقاطعة النقل ، وسيظل الدليل الأصلي كما هي:

$ mv a b/

إذا قمت بنقل دلائل متعددة ، فسيكون كل واحد منها كما هي إما على المصدر أو الوجهة ، حسب الوقت الذي توقفت فيه:

$ mv a b c/

كيف حصلت على إجابتي:

$ mv --version
mv (GNU coreutils) 8.21

$ info mv
... It first uses some of the same code that's used by `cp -a'
to copy the requested directories and files, then (assuming the copy
succeeded) it removes the originals.  If the copy fails, then the part
that was copied to the destination partition is removed.  If you were
to copy three directories from one partition to another and the copy of
the first directory succeeded, but the second didn't, the first would
be left on the destination partition and the second and third would be
left on the original partition.

كاختبار ، قمت بنسخ مجلد كبير إلى دليل NFS ، تمت مقاطعته ، وظل عدد الملفات في المجلد المصدر الكبير كما هو ، وتم ترك محتويات جزئية على دليل NFS. لقد استخدمت "find. -type f | wc -l" للتحقق.

يبدو أن إجابة سيمون صحيحة.


10
2018-05-15 16:49





الإجابة المقبولة هي بالتأكيد خاطئة حول الانتقال بين أنظمة الملفات - وهي حقيقة أنقذتني الكثير من المشاكل بالفعل عدة مرات بالفعل. عند نقل دليل يحتوي على أدلة فرعية ، لن يتم حذف أي ملف في دليل فرعي قبل أن يتم نسخ الدليل الفرعي بأكمله. هذا هو ، btw.the المعنى الفعلي لـ "كائن بواسطة كائن" - دليل فرعي هو كائن (ملف) وبالتالي يجب الحفاظ على سلامتها بنسخة كاملة في الوجهة قبل أن يمكن حذف أي شيء. لذا يبدو لي أن إجابة سايمون هي الإجابة الصحيحة.


7
2018-06-29 13:58





تقوم mv بتشغيل الكائن حسب الكائن ، لذلك ستتم إزالة الكائنات التي تمت معالجتها بالفعل من المصدر.


4
2018-03-18 09:34





قطعا لا. يتم إجراء الكائن الكائن بواسطة الكائن. ومن ثم ، فإن الكائن الذي تم نقله إلى الوجهة حتى نقطة المقاطعة لن يكون موجودًا في المصدر أكثر من ذلك.

إذا تم إصدار mv لملف كبير (بين مختلف) وتمت مقاطعته ، فسيكون المصدر سليمًا. على الهدف سترى ملف غير مكتمل يصل إلى نقطة الانقطاع.

ومع ذلك ، يمكنك استعادة mv باستخدام نفس الأمر وستستمر العملية.


2
2018-03-18 15:25





إذا كنت تريد مقاطعة mv لأنك تريد قطع الاتصال عن الجهاز ، يمكنك فقط إرساله إلى الخلفية:

* press Ctrl+Z

# bg
# disown

2
2018-05-28 16:59



هذه نقطة جيدة ولكنها لا تجيب على السؤال الفعلي. - Julie Pelletier
@ JuliePelletier ، ولكن هذا ما كنت أبحث عنه لذلك قد يكون هناك شخص مهتمًا بذلك. - Курочка Ряба