سؤال كيفية نقل جميع الملفات من الدليل الحالي إلى الدليل العلوي؟


كيفية نقل جميع الملفات من الدليل الحالي إلى الدليل العلوي في لينكس؟

حاولت شيء من هذا القبيل mv *.*لكنها لا تعمل.


126
2017-10-28 18:54


الأصل


ليس لدي ما يكفي من الأسئلة لإعادة صياغة الأسئلة ، ولكن قد أقترح [linux] [mv] [cwd] [files]، أو شيئا من هذا القبيل؟ - Stephan202
لقد قمت بإعادة صياغة هذا السؤال لكل طلب Stephan202. - eleven81
unix.stackexchange.com/a/251091/139312 - palindrom


الأجوبة:


الأمر الذي تبحث عنه هو

mv * .[^.]* ..

أو (انظر أدناه لمزيد من المعلومات):

(shopt -s dotglob; mv -- * ..)

شرح: mv الأمر ينقل الملفات والدلائل. الحجة الاخيرة ل mv هو الهدف (في هذه الحالة الدليل خطوة واحدة "لأعلى" في الشجرة ، ..). الوسيطات قبل ذلك هي الملفات المصدر والدلائل. النجمة (*) هو حرف بدل يتطابق مع جميع الملفات التي لا تبدأ بنقطة. الملفات التي تبدأ بنقطة (dotfiles) هي "مخفية". تتم مطابقتها باستخدام النمط .[^.]* (انظر التعديل أدناه).

انظر صفحة manpage التي ربطتها للحصول على مزيد من المعلومات حول mv.


لماذا ا .[^.]* بدلا من .* ؟

مثل كريس جونسن يشير بشكل صحيح: هذا النمط .* يطابق أيضا . و ... نظرًا لأنك لا تريد (ولا تستطيع) نقل تلك ، فمن الأفضل استخدام نمط يطابق أي اسم ملف يبدأ بنقطة باستثناء هذين. النمط .[^.]* يفعل ذلك فقط: يطابق أي اسم ملف (1) يبدأ بنقطة (2) متبوعاً بحرف وهو ليس نقطة (3) يتبعها صفر أو أكثر من الأحرف العشوائية.

مثل Paggas  يشير الى، سيكون علينا أيضًا إضافة النمط .??* لمطابقة الملفات التي تبدأ بنقطتين. انظر إجابته عن حل بديل باستخدام find.

في عرجان إجابة يذكر shopt لتجنب كل هذه المشاكل مع dotfiles. ولكن بعد ذلك لا تزال هناك مشكلة في الملفات التي تبدأ بشرطة. ويتطلب ثلاثة أوامر. لا يزال ، أنا أحب هذه الفكرة. أقترح استخدامه مثل هذا:

(shopt -s dotglob; mv -- * ..)

هذا ينفذ shopt في subshell (وبالتالي لا دعوة ثانية ل shopt المطلوبة) ويستخدم -- بحيث لا يتم تفسير الملفات التي تبدأ بـ شرطة على أنها وسائط لـ mv.


194
2017-10-28 19:01



عن طريق .* قد يتسبب ام لإنتاج تحذيرات / أخطاء حول عدم القدرة على التحرك . و ... قد تحاول mv * .[^.]* .. في حين أن. - Chris Johnsen
إجابة كاملة جدا شكرا.
alain: مرحبًا بك ، وأهلاً بك في الموقع! (إذا (و (إذا) فقط أجابت إحدى المشاركات عن سؤالك بشكل كافي ، عندئذ يمكنك وضع علامة عليه على هذا النحو ، وهذا سيحصل على الملصق على 15 نقطة سمعة إضافية ، كما سيعطيك 2 ريب إضافي.) - Stephan202
لا يوجد أي ضرر في الصيغة *. * بما في ذلك .. هو خطير فقط عند استخدامه مع chmod و chown وعلم "recurse" ، أي chmod -R أو chown -R. وفي تلك الحالات ، لا تفعل ذلك أبدا اكتب chown. * أو chmod. * - chown أعلى دليل في المسار الذي تبحث عنه واستخدم -h (لا تتبع الارتباطات الرمزية). لكن ، mv .. ببساطة لا تفعل أي شيء لذا لا تقلق بشأنها. - chris
الأنماط الثلاثة الصحيحة هي *، .[^.]* و ..?*. والثاني ربما .[!.]* للقذائف الأقدم (POSIX). اقرأ أيضا


الجواب باختصار: الاستخدام

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

اجابة طويلة:

الامر

mv * .* ..

لن يعمل منذ ذلك الحين .* يمكن أن تتطابق . و ... لكن الأمر

mv * .[^.]* ..

لن تعمل أيضا ، منذ ذلك الحين .[^.]* لن يتطابق ، على سبيل المثال ، ..filename! بدلا من ذلك ، ما أفعله هو

mv * .[^.] .??* ..

والتي سوف تتطابق مع كل شيء ما عدا . و ... * سوف تطابق كل شيء لا يبدأ مع .، .[^.] سيطابق جميع أسماء الملفات بحرفين تبدأ بنقطة ما عدا ..و .??* سيطابق كل أسماء الملفات بدءًا من نقطة بها 3 أحرف على الأقل.

الأفضل من ذلك ، يمكنك استخدام

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

الذي يتجنب الاختراق في العالم القبيح mv * .[^.] .??* ..!


42
2017-10-28 20:19



أيضا ، نسيت أن نلاحظ أهمية - بحيث يعمل الأمر بشكل صحيح مع أسماء الملفات بدءا من شرطة. لقد أدرجت - في جوابي العثور على الرغم من. الإجابة الأكثر اكتمالا باستخدام globs هي "mv - *. [^.]. ؟؟ * ..". - Paggas
+1: عدت لإضافة ..?* إلى تعليقي ، وكنت قد اعتنيت به بالفعل. - Chris Johnsen
ما يمكن أن يكون من الخطأ في محاولة mv ..؟ إنه ببساطة لا يفعل شيئًا ولا يمكنه فعل أي شيء. هناك أوامر أخرى حيث يستطيع القيام بشيء (chmod و chown) ولكن mv و rm ببساطة لا تفعل أي شيء. أو .. - chris
هذا يعطي MV: خيار غير قانوني - ر - pal4life
بونو ، الشرطات المزدوجة mv للتوقف عن البحث عن أي خيارات أوامر إضافية. الأقواس هي اسم الملف الناتج. علامة الجمع تقول بدلاً من تشغيل exec لكل نتيجة (على سبيل المثال ، لكل اسم ملف) ، وضع نتائج كثيرة في exec واحد بقدر الإمكان. للأكتمال، -t.. هو نقل الوجهة المستهدفة لنقل كل هذه الملفات إلى. - isuldor


فقط من أجل الاكتمال ، يمكن للمرء أيضًا أن يخبر قوقعة باش بتضمين الملفات المخفية ، باستخدام shopt:

shopt -s dotglob
mv -- * ..
shopt -u dotglob

14
2017-10-28 20:52



+1. نظافة كثير أعتقد أن هناك تحسن طفيف في النظام ، على الرغم من. انظر التحديث على جوابي. - Stephan202


يفتقر mv إلى وظيفة نقل الملفات المخفية عند الاستخدام * - فلماذا لا تستخدم نسخة بدلا من ذلك؟

cp -rf . ..

rm -rf *

لا حاجة للوصول إلى حلول معقدة من dotglobbing واستخدام الأوامر.


8
2017-08-02 20:46



تحذير إذا كنت تتحرك في نفس نظام الملفات، في الجزء الأكبر من الحالات ، لم تقم بنسخ الملفات فعليًا ولكن فقط قم بتحديث إدخالات الدليل دون تحريك inode أو file contenents. شاهد حتى [1]. مع cp و rm بدلا من ذلك أنت حقا نسخ كل شيء. - Hastur


rsync -a --remove-source-files . ..

rsync أداة قوية للغاية لنسخ الملفات ، تستخدم بشكل عام لأداء عمليات النسخ الاحتياطي والمرايا الإضافية المتزايدة الفعالة.

مع الأمر أعلاه ، نحن نقول rsync لنسخ محتوى . إلى ..

مفتاح -a تمكن العودية إلى . الدلائل الفرعية وتمكين بعض الخيارات الشائعة الأخرى.

مفتاح --remove-source-files يخبر rsync لإزالة الملفات المصدر بعد نسخة ناجحة ، أي أنه يجعل rsync تتصرف على نحو مماثل mv أمر.


6
2018-01-20 11:47



أكثر قليلا من الشرح سيكون لطيفا. - ChrisF
بالتأكيد ، آمل أن يكون أكثر وضوحا الآن. - mrucci
لاحظ أن --remove-source-files لن يؤدي إلى إزالة الدلائل (المتزامنة). - Dennis
حل لطيف ومقبول يعطيني -bash: /bin/mv: Argument list too long خطأ. هذا واحد يعمل مثل السحر. - userlond


محاولة في نهاية المطاف mv . سوف تفشل لأن mv لن يكون قادراً على إلغاء ارتباط الدليل الموجود حالياً. يمكنك ذلك mv * .. لنقل الملفات في cwd.


2
2017-10-28 18:59



مرحبا شكرا التي عملت!


mv * .??* ../.

* يحصل على جميع الملفات لا نقطة. .??* يحصل على كل شيء. ملفات طويلة على الأقل ثلاثة بايت ، والتي تعمل لجميع منها شرعي. أي شيء غادر ربما تريد rm عوضا عن mv على أي حال.

ال ../. لا تقدم أي فوائد مباشرة .. ولكن عند القيام بالانتقال إلى الدليل ، من المعتاد أن تدخل هذه العادة ، لأنها ستفشل ، كما تريد ، إذا كان هناك شيء خاطئ في المسار. فمثلا، mv xyz bletchاين انت يفكر  bletch هو دليل ، يمكن جعله أكثر ثقة mv xyz bletch/..


2
2017-10-28 19:47



قد تضيف .[^.] للحصول على ملفات الغلاف مثل .a. - Chris Johnsen
لا يوجد فرق بين ../ و ../. لذلك أنا لن أزعج كتابة. بعد القطع. أيضا ، في حالة mv و rm ، فإنه لا ضرر أن تدرج. و .. في القائمة ، أي ليس هناك أي شيء مخيف أو خطأ في mv *. * / path / to / file / ، تمامًا مثل rm. أو حتى - rf. لا تفعل أي شيء. - chris


يعمل هذا الأمر المصغر على معظم الأصداف الحديثة:

\mv -- {,.{[^.],??}}* ..

خلاف ذلك المذكور هو حل محمول:

\mv -- * .[^.] .??* ..

ميزات:

  1. \ يمنع الأسماء المستعارة من تغيير mv غير مرغوب فيه.

  2. - يمنع أسماء الملفات التي تحتوي على واصلات رئيسية (-xyz) من أن يتم تفسيرها كوسيطة سطر أوامر.

  3. . [^.] يتطابق مع جميع أسماء الملفات ذات الحرفين التي تبدأ بـ. إلا ..

  4. . * * يطابق جميع أسماء الملفات الأخرى ثلاثة أحرف أو أكثر.

تطبيقات السذاجة:

  1. يتخطى التالية أسماء ملفات UNIX المخفية ، تلك التي تبدأ. (.bashrc).

    mv * ..
    
  2. التطابقات التالية التي تحاول بشكل متكرر نقل كل دليل في النهاية إلى الخلف إلى / إلى .. دليل العمل الحالي (PWD أو PWD). لم أستعمل أبدا.

    mv .* ..
    

2
2017-08-12 08:12