سؤال

لدي اثنين من إدخالات الدليل ، أ و ب. من قبل ، يشير A و B إلى inodes مختلفة. بعد ذلك ، أريد أن يشير B إلى نفس inode كما يفعل. أريد أن يكون هذا آمنًا - وأعني به إذا فشلت في مكان ما ، إما B إما إلى inode الأصلي أو inode. على الأخص ، لا أريد أن ينتهي باختفاء ب.

MV هو ذري عند الكتابة فوق.

يبدو أن LN لا تعمل عند وجود الوجهة بالفعل.

لذلك يبدو أنني أستطيع أن أقول:

Ln A TMP MV TMP B

والتي في حالة الفشل سوف تترك ملف "TMP" حوله ، وهو أمر غير مرغوب فيه ولكن ليس كارثة.

هل هناك طريقة أفضل للقيام بذلك؟

(ما أحاول فعله بالفعل هو استبدال الملفات التي لها محتوى متطابق مع inode واحد يحتوي على هذا المحتوى ، مشترك بين جميع إدخالات الدليل)

هل كانت مفيدة؟

المحلول

 ln a tmp ; mv tmp b

هو في الواقع أسرع طريقة للقيام بذلك من الناحية الذرية ، كما ذكرت في سؤالك.

(Nitpickers Corner: أسرع لوضع كلا مكالمات النظام في برنامج واحد)

نصائح أخرى

ln a tmp && mv tmp b || rm tmp

يبدو أفضل ، إذا ln فشل ، و mv لن يتم تنفيذها (وتشوش stderr عندما يفشل).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top