كيف يمكنني عمل cp -r
نسخ كل شيء مطلقًا من الملفات والدلائل في الدليل
المتطلبات:
بلدي القبيح ، ولكن العمل ، الاختراق هو:
cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user
كيف يمكنني أن أفعل كل ذلك في أمر واحد دون مطابقة النمط؟ ما العلم الذي أحتاجه لاستخدامه؟
لا تحدد الملفات:
cp -r /etc/skel /home/user
(لاحظ أن /home/user
يجب ألا يكون موجودًا بالفعل ، وإلا فسيقوم بإنشاء /home/user/skel
.)
لنفترض أنك قمت بإنشاء المجلد الجديد (أو ستقوم بإنشاء مجلد) وتريد نسخ الملفات إليه بعد إنشاء المجلد
mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>
سيؤدي هذا إلى نسخ جميع الملفات/المجلد بشكل متكرر من /etc/skel
إلى المجلد الموجود بالفعل الذي تم إنشاؤه في السطر الأول.
bash
في حد ذاته لديه حل جيد ، وله Shell option
، ويمكنك cp
، mv
وهلم جرا:
shopt -s dotglob # for considering dot files (turn on dot files)
و
shopt -u dotglob # for don't considering dot files (turn off dot files)
الحل أعلاه هو معيار bash
ملحوظة:
shopt # without argument show status of all Shell options
-u # abbrivation of unset
-s # abbrivation of set
تتمثل الوسيلة الصحيحة للقيام بذلك في استخدام الخيار -T (--no-target-directory)
، ونسخ المجلدات بشكل متكرر (بدون الزائدة المائلة ، العلامات النجمية ، إلخ) ، أي:
cp -rT /etc/skel /home/user
سيؤدي هذا إلى نسخ محتويات /etc/skel
إلى /home/user
(بما في ذلك الملفات المخفية) ، وإنشاء المجلد /home/user
إذا لم يكن موجودًا ؛ ومع ذلك ، فإن الخيار -T
يمنع محتويات /etc/skel
من أن يتم نسخها إلى مجلد جديد /home/user/skel
في حالة وجود المجلد /home/user
.
استخدم rsync:
rsync -rtv source_folder/ destination_folder/
إذا كان الدليل المصدر والهدف لديك لهما نفس الاسم ، حتى إذا كان الدليل الهدف موجودًا ، يمكنك ببساطة كتابة:
cp -R /etc/skel /home/
سيؤدي هذا إلى نسخ الدليل/etc/skel إلى/home/، بما في ذلك الملفات والأدلة المخفية.
في النهاية ، يمكنك نسخ الدليل وإعادة تسميته في سطر واحد:
cp -R /etc/skel /home/ && mv /home/skel /home/user
rsync
جيد ، لكن خيارًا آخر:
cp -a src/ dst/
من المساعدة الرئيسية:
-a, --archive
same as -dR --preserve=all
-d same as --no-dereference --preserve=links
-R, -r, --recursive
copy directories recursively
يمكنك استخدام رسينك.
rsync -aP ./from/dir/ /some/other/directory/
يمكنك حتى نسخ أكثر من سه
rsync -aP ./from/dir/ [email protected]:/some/other/directory/
هناك العديد من الأعلام التي يمكنك استخدامها: -a ، - archive # archive (-rlptgoD)
-r, --recursive
-l, --links # copy symlinks as links
-p, --perms # preserve permissions
-t, --times # preserve times
-g, --group # preserve group
-o, --owner # preserve owner
-D # --devices --specials
--delete # Delete extra files
You may want to add the -P option to your command.
--partial # By default, rsync will delete any partially transferred file if the transfer is interrupted. In some circumstances it is more desirable to keep partially transferred files. Using the --partial option tells rsync to keep the partial file which should make a subsequent transfer of the rest of the file much faster.
-P # The -P option is equivalent to --partial --progress. Its purpose is to make it much easier to specify these two options for a long transfer that may be interrupted.
cp -r /etc/skel/{.,}* /home/user
يتضمن التعبير {.,}*
جميع الملفات والدلائل (يبدأ أيضًا بنقطة).
إذا كنت لا تريد استخدام التعبير أعلاه ، فيمكنك استخدام الخاصية cp
، وهي القدرة على تحديد مصادر متعددة لمجلد هدف واحد:
cp -r /etc/skel/* /etc/skel/.* /home/user
لاحظ أن هناك خدعة سطر أوامر (تعمل على الأقل ، sh ، bash ، و ksh ): فقط لاحقة من الدليل بشرطة مائلة. سيؤدي ذلك إلى سكب محتويات من الدليل إلى إلى الدليل (ومن المفارقات أنني تعلمت لأول مرة عن هذه الخدعة عندما باستخدام rsync ).
مثال:
/tmp$ mkdir test_dir1
/tmp$ cd test_dir1/
/tmp/test_dir1$ touch aa
/tmp/test_dir1$ touch .bb
/tmp/test_dir1$ cd ..
/tmp$ mkdir test_dir2
/tmp$ cp -r test_dir1/* test_dir2
/tmp$ ls -1a test_dir2
.
..
aa
/tmp$ cp -r test_dir1/ test_dir2
/tmp$ ls -1a test_dir2
.
..
.bb
aa
لقد جئت إلى هنا بعد أن غوغل للتوصل إلى حل للمشكلة نفسها ، ثم أدركت أنه من السهل القيام بالعثور عليها. الميزة التي لا تعتمد عليها على Shell أو الأدوات المساعدة الخاصة التي قد لا تكون مثبتة.
find /etc/skel/ -mindepth 1 -exec cp -r {} /home/username/ \;
جربت الحيلة بشرطة مائلة زائدة ، لكن ذلك لم ينفعني.
الحل الخاص بي لهذه المشكلة عندما يكون لدي نسخ جميع الملفات (بما في ذلك ملفات .
) إلى دليل هدف الاحتفاظ بالأذونات هو: (الكتابة فوق إذا كانت موجودة بالفعل)
yes | cp -rvp /source/directory /destination/directory/
yes
مخصص للكتابة التلقائية للملفات الوجهة ، r
العودية ، v
مطوّل ، p
يحتفظ بالأذونات.
لاحظ أن المسار المصدر لا ينتهي بـ /
(بحيث يتم نسخ جميع الملفات/الدليل و. الملفات)
ينتهي دليل الوجهة بـ /
بينما نضع محتويات المجلد المصدر إلى الوجهة ككل.
لقد رأيت أن cp لا يقوم دائمًا بنسخ الملفات المخفية ، وإذا كنت ترغب في أمر يبدو أنه يعمل عبر جميع لهجات linux/unix ، فيجب أن تحاول استخدام:
cd /etc/skel
find | cpio -pdumv /home/user