سؤال كيف يمكنني جعل chown العمل بشكل متكرر؟


لدي دليل يسمى pdfs يحتوي على مجموعة من الدلائل الفرعية ودون الفرعية. أرغب في تغيير الملكية على جميع ملفات PDF في كل المجلدات الفرعية. لقد حاولت هذا فقط:

chown -R someuser:somegroup *.pdf

... لكنه لم يغير ملكية ملفات PDF في الدلائل الفرعية. المستخدم والمجموعة موجودة.

وفقا لصفحة الرجل ل chown، ال -R يجب أن تعني متكررة:

-R, --recursive
          operate on files and directories recursively

ماذا ينقصني؟


234
2018-03-22 16:29


الأصل




الأجوبة:


الوضع المتكرر يعمل فقط على الدلائل ، وليس الملفات. من خلال استخدام glob '* .pdf' ، تقوم shell بتمرير قائمة الملفات إلى chown ، والتي ترى أنها ملفات ، وتغير الأذونات على الملفات التي تراها ، وهذا كل شيء.

تذكر ، في shells ، يتم تقييم الكرة الأرضية بواسطة shell ، وليس الأمر. إذا تطابق الكرة الأرضية مع الملفات ، فسيتم تمريرها إلى الأمر ولا يعلم الأمر أن هناك أي كرة موجودة. (يختلف هذا عن كيفية استخدام موجه الأوامر في Windows للقيام بالأشياء). إذا كان لديك دير ، فمع محتوياته مثل:

machine:$ ls -F
file1.pdf  file2.pdf  other.txt  subdir/

وأنت قمت بكتابة:

chown -R someuser:somegroup *.pdf

ستقوم shell أولاً بعمل القائمة: file1.pdf file2.pdf

ثم قم بتشغيل الأمر الخاص بك:

chown -R someuser:somegroup file1.pdf file2.pdf

انظر ، لا يوجد دليل لـ -R للعمل. يفعل ما طلبته - تغيير الملكية على الملفين على سطر الأوامر ، مع تجاهل هذا العلم -R ملتوي.

للقيام بما تريد ، لاستخدام "* .pdf" كنمط لهذا الدليل والدلائل الفرعية ، يمكنك استخدام find، والتي يمكن العثور على الملفات التي تطابق نمط اسم الملف (أو العديد من المعايير الأخرى) وتمريرها إلى أمر ثانوي

find . -type f -name '*.pdf' | xargs chown someuser:somegroup

هذا يبدأ في دير الحالي "." للبحث عن الملفات (filetype f) لنمط الاسم '*.pdf' ثم يمر إلى xargs ، الذي يبني سطر الأوامر إلى chmod. لاحظ علامات الاقتباس حول النمط '*.pdf'تذكر أن القوقعة ستخلق كرة إذا استطاعت ذلك ، لكنك تريد أن ينتقل النمط find، لذلك تحتاج إلى اقتباسها.

نظرًا لأن أسماء الملفات قد تحتوي على فراغات ، فأنت تريد استخدام خدعة لجعلها آمنة مع أسماء:

find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup

في bash 3 و lower ، هذه هي الطريقة التي تحتاجها للقيام بذلك. أقوى globbing متاحة في باش 4 (مع shopt -s globstar) وغيرها من القذائف. الشيء نفسه في zsh ، وذلك باستخدام كروية متكررة **:

chown -R someuser:somegroup ./**/*.pdf

242
2018-03-22 16:47



تم تعديله ليعكس ذلك bash 4 مع shopt -s globstar لا العودية globbing. - kojiro
kojiro شكرا! كما يمكنك معرفة ما زلت أستخدم bash3 - Rich Homolka
في صفحة الرجل التي تظهر في الملصق الأصلي ، وجدت أن chown -R قام بالفعل بتغيير المالك على المجلدات والملفات. لا حاجة للبحث. باستخدام النعناع 15. - gwideman
gwideman أعلم أن هذا أمر قديم ... لكن نعم ، بالطبع - لا يتكرر. كان OP مجرد مشكلة مع نوع محدد للغاية من العودية ، وهو امتداد و "ملف نوع الملف" مرشح واحد - Rich Homolka
RichHomolka Ah. وقال OP كانت الملفات في دليل يسمى "ملفات PDF، لذلك أنا افترض أن المشكلة في كيفية تحديد ملفات PDF كدليل لعنة، وبأن جميع الوارد كانت الملفات ملفات PDF، لذلك لا حاجة لتحديدها على وجه التحديد. ولكن قد تكون على حق ، إذا كانت المهمة هي اختيار ملفات pdf فقط ، وترك الآخرين دون تغيير. - gwideman


انها ليست معقدة.

chown -R someuser:somegroup /your/folder/here/*

سيطبق هذا chown على كافة الملفات وكافة الدلائل الفرعية والدلائل الفرعية الفرعية للمجلد المحدد. استخدم بحذر.


33
2017-11-09 11:44



من الواضح أن شخص ما يجيب عليها منذ 4 سنوات ، ولكن تاي للتحذير. - Francisco Tapia
هذا السؤال هو رقم 1 حاليًا على Google ، لذا من المهم ملاحظة الإجابة الصحيحة. - Sprachprofi
بالتأكيد ، واحد مقبول أكثر أناقة ، وقراءة وكاملة - Francisco Tapia
بطريقة ما sudo chown -R user ./ عملت بالنسبة لي ، ولكن sudo chown -R user ./* لم - Slav
وأنا أعلم أن هذا أمر قديم ، ولكن على الرغم من أن هذا يجيب على العنوان ، لا يجيب على السؤال. هذا هو في الواقع أسوأ قليلا مما كان OP حاولت بالفعل. - Rich Homolka


يمكنك استعمال ال find خدمة:

find . -name '*.pdf' -exec chown someuser:somegroup {} +

من فضلك لا ننسى يقتبس حولها *.pdf. وإلا فإن shell سيحاول توسيعه. وهذا يعني بالفعل أن الصدفة سوف تحل محلها *.pdf مع أسماء جميع ملفات PDF الموجودة في الدليل الحالي. لكن هذا ليس ما تريده تريد العثور على ملفات PDF الموجودة في الدلائل الفرعية. راجع للشغل: هذا هو أيضا مشكلة مع الخاص بك chown أمر.


14
2018-03-22 16:37



اضطررت الى البحث عن +، خدعة أنيقة للأداء. -exec command {} + يقوم هذا الخيار من إجراء -exec بتشغيل الأمر المحدد في الملفات المحددة ، ولكن يتم إنشاء سطر الأوامر عن طريق إلحاق كل اسم ملف محدد في النهاية ؛ العدد الإجمالي لعمليات استدعاء الأمر سيكون أقل بكثير من عدد الملفات المتطابقة. تم بناء سطر الأوامر بالطريقة نفسها تمامًا xargs يبني خطوطه القيادة. مثيل واحد فقط من {} يسمح داخل الأمر. يتم تنفيذ الأمر في دليل البدء. - Patrick M
@ PatrickM واحد (ثانوي) ميزة أخرى إلى + مقابل. .... plus ليس حرفًا مميزًا للصفائح ولا يجب تجنبه - Rich Homolka


الامر

chown -R someuser:somegroup *.pdf

سوف تتابع فقط الدلائل إذا كان دليل الاسم ينتهي بـ .pdf. أنت بحاجة إلى شيء مثل:

find . -name "*.pdf" -exec chown someuser:somegroup {} \;

6
2018-03-22 16:38



من الناحية الفنية سوف تذهب فقط إلى مستوى واحد لأسفل. سواء كنت استدعاء هذا العودية الحقيقية أم لا هو تمرين للمستخدم :) - Rich Homolka


لتغيير ملكية الدليل بشكل متكرر ، استخدم ببساطة:

sudo chown -R <username>:<groupname> <dir name>

اسم المستخدم هنا = المستخدم الجديد الذي يجب أن يكون مالك الدليل

groupname = المجموعة الجديدة التي يجب أن تكون مالكًا للدليل

يحتوي كل ملف / دليل على مالك المستخدم ومالك المجموعة


0
2018-05-11 01:38



هذا لا يفعل ما طلب البروتوكول الاختياري. هذا يغير ملكية كل شيء ، طلب OP مجموعة محددة من الملفات. - Rich Homolka


أنا أستعمل tree في حين أن:

 sudo tree -fai ~/.blabla  | xargs -L1 -I{} sudo chown youruser:youruser {}

احرص أيضًا على عدم تشغيل chown العودية أو chmod على '/' الدليل أو دليل النظام الآخر.


0
2018-01-25 13:36