मैं चाउर कार्य को पुनरावर्ती कैसे बना सकता हूं?


285

मुझे एक निर्देशिका मिली pdfsहै, जिसमें उप- और उप-उप-निर्देशिकाओं का एक समूह है। मैं सभी सबफ़ोल्डर्स में सभी पीडीएफ फाइलों पर स्वामित्व बदलना चाहता हूं। मैंने अभी यह कोशिश की:

chown -R someuser:somegroup *.pdf

... लेकिन इसने उपनिर्देशिकाओं में पीडीएफ के स्वामित्व को नहीं बदला। उपयोगकर्ता और समूह मौजूद हैं।

के लिए आदमी पृष्ठ के अनुसार chown, -Rपुनरावर्ती का मतलब होना चाहिए:

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

मैं क्या खो रहा हूँ?

जवाबों:


291

पुनरावर्ती मोड केवल निर्देशिकाओं पर काम करता है, फाइलों पर नहीं। ग्लोब * * .pdf 'का उपयोग करके शेल फाइल लिस्ट को चांस करने के लिए पास कर रहा है, जो देखता है कि ये फाइल हैं, और यह जो फाइल देखता है उस पर अनुमतियों को बदलता है, और यही है।

याद रखें, गोले में, गोला का मूल्यांकन शेल द्वारा किया जाता है, कमांड से नहीं। यदि ग्लोब फ़ाइलों से मेल खाता है, तो वे कमांड को पास किए जाते हैं और कमांड को कभी पता नहीं चलता कि एक ग्लोब मौजूद है। (यह विंडोज कमांड प्रॉम्प्ट चीजों को करने के तरीके से अलग है)। यदि आपके पास एक dir है, तो सामग्री कुछ इस तरह है:

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

और आपने टाइप किया:

chown -R someuser:somegroup *.pdf

शेल पहले सूची बनाएगा: file1.pdf file2.pdf

और फिर अपना कमांड चलाएं:

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

देखें, -R पर कार्य करने के लिए कोई निर्देशिका नहीं है। यह वही करता है जो आपने इसे कहा था - कमांड लाइन पर दो फाइलों पर स्वामित्व को बदलना, उस विचित्र-आर ध्वज को अनदेखा करना।

इस निर्देशिका और उपनिर्देशिकाओं के लिए एक पैटर्न के रूप में '* .pdf' का उपयोग करने के लिए, आप जो चाहते हैं, वह करने के लिए find, जो फाइल फ़ाइल पैटर्न (या कई अन्य मानदंड) से मेल खाती है और एक उप-पृष्ठ पर जा सकते हैं

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

यह वर्तमान डायर में शुरू होता है '।' नाम पैटर्न की फ़ाइलों (फ़िलाटाइप f) को देखने के लिए '*.pdf'फिर xargs में जाता है, जो कि chmod को कमांड लाइन बनाता है। पैटर्न के आसपास के उद्धरणों को ध्यान से देखें '*.pdf', याद रखें कि शेल एक ग्लोब बनाएगा यदि यह हो सकता है, लेकिन आप चाहते हैं कि पैटर्न पास हो findजाए, इसलिए आपको इसे उद्धृत करने की आवश्यकता है।

क्योंकि फ़ाइल नाम में स्थान हो सकते हैं, आप इसे फ़ाइल नाम के साथ रिक्त स्थान को सुरक्षित बनाने के लिए एक चाल का उपयोग करना चाहते हैं:

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

बैश 3 और लोअर में, यह वह तरीका है जिसे आपको करने की आवश्यकता है। अधिक शक्तिशाली ग्लोबिंग बैश 4 (साथ shopt -s globstar) और अन्य गोले में उपलब्ध है। एक पुनरावर्ती ग्लोब का उपयोग करते हुए zsh में समान **:

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

1
प्रतिबिंबित करने के लिए संपादित किया गया है कि बैश 4 के साथ shopt -s globstarपुनरावर्ती ग्लोबिंग करता है।
कोजिरो

@kojiro धन्यवाद! जैसा कि आप बता सकते हैं मैं अभी भी bash3 का उपयोग करता हूं
रिच

2
मूल पोस्टर द्वारा दिखाए गए मैन पेज के अनुसार, मैंने पाया कि चाउन -R ने फ़ोल्डर और फ़ाइलों पर वास्तव में मालिक को बदल दिया है। खोजने की कोई जरूरत नहीं।
रास

@gwideman मुझे पता है कि यह पुराना है ... लेकिन हां, बेशक -R पुनरावर्ती करता है। ओपी में एक बहुत ही विशिष्ट प्रकार की पुनरावृत्ति के साथ एक मुद्दा था, एक एक्सटेंशन और "फ़ाइल प्रकार फ़ाइल है" फ़िल्टर्ड एक
रिच होमोलका

@ रीचोमोल्का आह। ओपी ने कहा कि फाइलें 'pdfs' नामक एक निर्देशिका में थीं, इसलिए मैंने यह मान लिया कि समस्या को पुनरावृत्ति करने के लिए निर्देशिका के रूप में pdfs को कैसे निर्दिष्ट किया जाए, और सभी समाहित फाइलें pdfs थीं, इसलिए उन्हें विशेष रूप से चुनने की आवश्यकता नहीं है। लेकिन आप अच्छी तरह से सही हो सकते हैं, अगर नौकरी केवल पीडीएफ फाइलों का चयन करना है, और दूसरों को अपरिवर्तित छोड़ना है।
23

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

यह सभी फ़ाइलों और सभी उपनिर्देशिकाओं और निर्दिष्ट फ़ोल्डर के उप-उपनिर्देशिकाओं पर chown लागू होगा। देखभाल के साथ उपयोग करें।


2
किसी तरह sudo chown -R user ./मेरे लिए काम किया, लेकिन sudo chown -R user ./*नहीं
स्लाव

1
मुझे पता है कि यह पुराना है, लेकिन यद्यपि यह शीर्षक का जवाब देता है, लेकिन सवाल का जवाब नहीं देता है। यह वास्तव में ओपी द्वारा पहले से ही कोशिश की गई तुलना में थोड़ा खराब है।
रिच होमोलका

2
@RichHomolka प्रश्न शीर्षक के कारण ही यहाँ लाया गया था, मैं इस उत्तर को पाकर काफी खुश हूँ।
फेलिक्स गगनोन-ग्रेनियर

@ FélixGagnon-Grenier मेला काफी। यदि यह उत्तर आपके लिए काम करता है तो मैं बहुत खुश हूँ। लेकिन यह मूल प्रश्न के लिए काम नहीं करता।
रिच होमोलका

ऐसा लगता है कि डॉट फ़ाइलों के लिए काम नहीं कर रहा है .env
रयान

14

आप findउपयोगिता का उपयोग कर सकते हैं :

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

कृपया उद्धरण चिह्नों के आसपास मत भूलना *.pdf। अन्यथा शेल इसे विस्तारित करने का प्रयास करेगा। इसका मतलब है कि पहले से ही शेल *.pdfमौजूदा निर्देशिका में पाए गए सभी पीडीएफ फाइलों के नामों से बदल जाएगा । लेकिन वह नहीं है जो आप चाहते हैं। आप उपनिर्देशिकाओं में स्थित पीडीएफ फाइलों को खोजना चाहते हैं। Btw .: यह भी आपके chownआदेश के साथ समस्या है ।


1
मुझे +प्रदर्शन के लिए साफ सुथरी चाल दिखानी पड़ी। -exec command {} +-Exec कार्रवाई का यह संस्करण चयनित फ़ाइलों पर निर्दिष्ट कमांड चलाता है, लेकिन कमांड लाइन अंत में प्रत्येक चयनित फ़ाइल नाम को जोड़कर बनाया गया है; कमांड की कुल संख्या का मिलान की गई फ़ाइलों की संख्या से बहुत कम होगा। कमांड लाइन को उसी तरीके से बनाया गया है जो xargsअपनी कमांड लाइनों को बनाता है। {}कमांड के भीतर केवल एक उदाहरण की अनुमति है। कमांड को शुरुआती डायरेक्टरी में निष्पादित किया जाता है।
पैट्रिक एम

@PatrickM एक (मामूली) + बनाम के अन्य लाभ; .... प्लस एक शेल मेटा कैरेक्टर नहीं है और
बचना

6

आदेश

chown -R someuser:somegroup *.pdf

यदि निर्देशिका का नाम .pdf में समाप्त हो जाता है , तो केवल निर्देशिकाओं को वापस लाएगा। आपको कुछ इस तरह की आवश्यकता है:

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

तकनीकी रूप से यह केवल एक स्तर नीचे जाएगा। चाहे आप उस वास्तविक पुनरावर्तन को कहते हैं या नहीं उपयोगकर्ता के लिए एक अभ्यास है :)
रिच होमोलका

1

किसी निर्देशिका के स्वामित्व को पुन: उपयोग में बदलने के लिए:

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

यहां उपयोगकर्ता नाम = नया उपयोगकर्ता जो निर्देशिका का स्वामी होना चाहिए

groupname = नया समूह जो निर्देशिका का स्वामी होना चाहिए

हर फ़ाइल / निर्देशिका में एक उपयोगकर्ता स्वामी और एक समूह स्वामी होता है


यह वह नहीं करता है जो ओपी ने पूछा था। यह सब कुछ का स्वामित्व बदलता है, ओपी ने फाइलों के एक विशिष्ट सेट के लिए कहा।
रिच होमोलका

0

मैं treeइसके बजाय उपयोग करता हूं :

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

यह भी ध्यान रखें कि '/' डायरेक्टरी या अन्य सिस्टम डायरेक्टरी पर रिकर्सिव चाउन या चामॉड न चलाएं।


0

एक निर्देशिका में सभी फ़ाइलों के मालिक बनने के लिए, उपयोग करें

find directory -type f -name '*' | sudo xargs -d '\n' chown $USER

के बजाय

sudo chown $USER directory\*

या

sudo chown --recursive $USER directory

जो काम नहीं कर सकता है अगर वहाँ बहुत सारे तर्क * (निर्देशिका में बहुत सारी फाइलें) द्वारा उत्पादित हैं या जो आप क्रमशः नहीं चाहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.