วิธี Chown ไดเรกทอรีซ้ำรวมถึงไฟล์ที่ซ่อนอยู่หรือไดเรกทอรี


37

ดูเหมือนว่า chown ด้วยแฟล็ก recursive จะไม่ทำงานกับไดเร็กทอรีหรือไฟล์ที่ซ่อน มีวิธีแก้ปัญหาง่าย ๆ สำหรับสิ่งนั้นหรือไม่?

คำตอบ:


56

ฉันค่อนข้างมั่นใจว่า-Rธงใช้งานได้ - มันมีไว้สำหรับฉันเสมอ สิ่งที่ใช้ไม่ได้ผลและสิ่งที่ทำให้ฉันสะดุดในช่วงต้นของการใช้บรรทัดคำสั่งคือใช้*ในไดเรกทอรีที่มีไฟล์ / ไดเรกทอรีที่ซ่อนอยู่ ดังนั้นการทำ

$ chown -R /home/user/*

จะไม่ทำไฟล์และไดเรกทอรีที่ซ่อนอยู่ อย่างไรก็ตามหากคุณติดตามด้วย

$ chown -R /home/user/.[^.]*

จากนั้นคุณจะทำทุกไฟล์ที่ซ่อนอยู่ (แต่ไม่ใช่.หรือ..เป็นไปตาม/home/user/.*นั้น) ต้องบอกว่าฉันคาดหวัง

$ chown -R /home/user

เพื่อให้ได้ไฟล์และไดเรกทอรีที่ซ่อนอยู่ภายใน/home/user- แม้ว่าแน่นอนว่าจะเปลี่ยนสิทธิ์ของไดเรกทอรีเองด้วยซึ่งอาจไม่ใช่สิ่งที่คุณตั้งใจ


3
การทำchownในไดเรกทอรีมีผลข้างเคียงที่คุณเปลี่ยนการอนุญาตในไดเรกทอรีเองรวมถึงเนื้อหาทั้งหมดซึ่งอาจหรืออาจไม่ใช่สิ่งที่คุณต้องการ
wfaulk

A + ทำงานเหมือนมีเสน่ห์สำหรับฉัน
SuperFamousGuy

ฉันลองchown nginx:nginx -R /path/to/.[^.]*และมันเปลี่ยนความเป็นเจ้าของเป็นไฟล์ที่ซ่อนไว้เท่านั้น ไม่ทั้งหมด.
Pathros

@wfaulk ตามที่ได้รับการกล่าวถึงโดย @Hamish Downer คุณต้องทำทั้งสองอย่าง*และติดตามด้วย.[.^]*เพื่อรับไฟล์ทั้งหมด
god_is_love

9

ฉันเชื่อว่าคำสั่งต่อไปนี้จะทำงานสำหรับเรื่องนี้

chown -hR userid:usergroup /nameofdirectory/nameofsubdir/

1
-h ส่งผลกระทบต่อการเชื่อมโยงสัญลักษณ์แทนไฟล์อ้างอิงใด ๆ (มีประโยชน์เฉพาะในระบบที่สามารถเปลี่ยนความเป็นเจ้าของ symlink)
R. van Twisk

8

"chown -R" ใช้งานได้ แต่จะมีทางเลือกอื่นให้ใช้ find

 find /path/to/dir -exec chown USER {} \;

5
ทราบว่ามีการค้นพบ GNU ใช้+แทน;เป็นเทอร์มิเพื่อ -exec จะมีประสิทธิภาพมากขึ้นในขณะที่มันจะใช้จำนวนขั้นต่ำที่จำเป็นของส้อม chown แทนหนึ่งส้อมต่อไฟล์ / directory
สตูว์

3

คุณสามารถเปลี่ยนdotglobคุณสมบัติชั่วคราวเพื่อขยาย ไฟล์และย้อนกลับ

shopt -s dotglob; chown -R user:group FOLDER; shopt -u dotglob

ข้อมูลเพิ่มเติมdotglobสามารถพบได้ที่นี่


2

ใช้สำหรับวงที่มีls -Aตัวเลือกที่เราสามารถหาไฟล์ที่ซ่อนอยู่และไดเรกทอรียกเว้น.และ..แล้วเปลี่ยนความเป็นเจ้าของสำหรับไฟล์ที่ซ่อนอยู่และไดเรกทอรี

for i in `ls -A | grep "^\."`;do chown -R user:group $i;done

ใช้xargsตัวเลือกด้วยls -A

ls -A | grep "^\." | xargs chown user:group

สำหรับรายละเอียดเพิ่มเติมคลิกที่นี่และเยี่ยมชมเว็บไซต์ของฉัน


1

นอกจากนี้หากคุณเป็นเหมือนฉันคุณอาจจะกำลัง chown ส่วนใหญ่จากไดเรกทอรีปัจจุบัน ฉันคุ้นเคยกับการใช้งานแบบนี้: chown rails.rails -R *. เพียงเปลี่ยนเครื่องหมายดอกจันเป็นจุด (ย่อมาจากไดเรกทอรีปัจจุบัน) ดังนี้: chown rails.rails -R .นำไดเรกทอรีที่ซ่อนอยู่ทั้งหมด


2
ด้วยผลข้างเคียงที่คุณเปลี่ยนการอนุญาตในไดเรกทอรีปัจจุบันรวมถึงเนื้อหาทั้งหมดซึ่งอาจจะใช่หรือไม่ใช่สิ่งที่คุณต้องการ
wfaulk

1

chownจะทำงานกับไฟล์และไดเรกทอรีที่ซ่อนอยู่ ในตัวอย่างต่อไปนี้เราจะมีการเปลี่ยนแปลงของผู้ใช้และกลุ่มเจ้าของสำหรับทุก~/some/folderไฟล์ใน ทุกไฟล์รวมทั้งหมดซ่อนไฟล์ (เช่น.bashrc, .profileฯลฯ ) และโฟลเดอร์ที่~/some/folderระดับต่ำกว่า โปรดทราบว่าเราไม่ต้องการเปลี่ยนความเป็นเจ้าของ~/someดังนั้นเราจะแยกไฟล์~/some/..ออกจากการเปลี่ยนแปลงความเป็นเจ้าของ

$ cd ~/some/folder 
$ sudo chown -R usrname:grpname . 
$ 

สิ่งนี้ใช้ได้กับฉัน
klor

0

หากต้องการ chown ไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยสำหรับผู้ใช้ปัจจุบัน

find . -exec chown $(whoami) {} \;

หรือหากผู้ใช้ไม่สามารถ chown ไฟล์บางไฟล์เนื่องจากสิทธิ์ที่ จำกัด ;

sudo find . -exec chown $(logname) {} \;

-2

คุณสามารถทำสิ่งที่ชอบ

for i in `ls -A`;do chown -R user:group $i;done

-A( ทุน A) เป็นสิ่งสำคัญที่จะไม่รวม '' และ '.. '


สิ่งนี้จะเปลี่ยนเฉพาะไฟล์และไดเรกทอรีย่อยในไดเรกทอรีปัจจุบันไม่ใช่ระดับที่ต่ำกว่า (ซึ่งอาจเป็นสิ่งที่ OP ต้องการ) นอกจากนี้ยังจะแบ่งชื่อไฟล์และชื่อไดเรกทอรีที่มีช่องว่าง (หรือแท็บ) ในพวกเขา
wfaulk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.