it-swarm.asia

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

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

جربت شيئًا مثل mv *.* ، لكنه لا يعمل.

131
asksuperuser

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

mv * .[^.]* ..

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

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

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

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


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

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

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

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

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

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

199
Stephan202

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

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

اجابة طويلة:

الامر

mv * .* ..

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

mv * .[^.]* ..

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

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

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

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

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

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

42
Paggas

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

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

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

cp -rf . ..

rm -rf *

لا حاجة للدخول في حلول معقدة من dotglobbing واستخدام أوامر البحث.

8
Micky Martin
rsync -a --remove-source-files . ..

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

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

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

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

6
mrucci

من الأصح استخدام النمط * .[!.] .??* أكثر من * .[^.] .??* لأن السابق سيعمل أيضًا مع الأصداف القديمة مثل ksh88:

mv -- * .[!.] .??* ..
  • -- يمنع المشاكل عندما يكون لديك اسم ملف يبدأ بـ -
  • * يطابق جميع أسماء الملفات التي لا تبدأ بـ .
  • لا توجد أسماء لملفات شخصية واحدة تبدأ بـ . والتي يمكنك/يجب نقلها
  • .[!.] يطابق جميع أسماء ملفات الأحرف التي تبدأ بـ .
  • .??* يطابق أسماء ملفات الأحرف الثلاثة (أو أطول) والتي تبدأ بـ .

باستخدام ksh88 ، سيتطابق نمط اسم الملف .[^.] في الواقع مع أسماء الملفات .. (الموجودة دائمًا) و .^ (التي ربما لا وجود لها) ، ويكون لها تأثير عكس ما هو مطلوب.

2
jrw32982

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

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

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

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

المميزات:

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

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

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

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

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

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

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

    mv .* ..
    
2
dhchdhd

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

2
DaveParillo
mv * .??* ../.

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

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

2
DigitalRoss

البحث و grep العمل أيضا. قد يكون هذا النوع من البنية مفيدًا إذا أردت تحديد الملفات وفقًا لمعايير أكثر تعقيدًا عن طريق تعديل البحث و egrep.

find -maxdepth 1 | egrep '^./.'         # Returns all files

mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
0
user3192145

أعتقد أن الحل الأسهل لنقل جميع الملفات إلى ملفها الأصل dir. سيكون

mv "`ls`" ../

أو ، إذا كان هناك ملفات/دلائل مخفية

استعمال:

mv "`ls -a`" ../ 2>/dev/null

أيضًا ، لنفترض أنك تريد نقل محتويات بعض المجلدات إلى أحد مجلدات المجلد الداخلي (say)

استعمال:

mv "`ls -a`" /tony 2>/dev/null

ملحوظة:

"`ls -a`" 

لنقل الملفات التي تحتوي على مسافات فيها.

2>/dev/null

هو لمنع التحذير/الخطأ لأن ls -a سيطبع مجلد . و .. أيضًا ولا يمكنك نقله أو نسخه. بالنسبة إلى هذه المجلدات ، سيظهر خطأ (إذا لم نستخدم 2>/dev/null) أنه لا يمكن نقلها وسيتم نقل الباقي بشكل مريح للغاية.

من الأفضل تجنب ls -a إذا لم يكن هناك ملفات مخفية واستخدم ls فقط.

0
Prabhat Kumar Singh