วิธีการ chown / chmod ไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน?


56

ฉันพยายามเปลี่ยนความเป็นเจ้าของและการอนุญาตของบางไฟล์ (และไดเรกทอรี) ในไดเรกทอรีปัจจุบัน ฉันลองสิ่งนี้:

chown username:groupname .

... คาดหวังว่ามันจะส่งผลกระทบต่อไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน แต่เพียงส่งผลกระทบต่อไดเรกทอรีที่ฉันอยู่ (ซึ่งตรงกันข้ามกับสิ่งที่ฉันต้องการจะทำ) ฉันต้องการเปลี่ยนมันในไฟล์ทั้งหมดโดยไม่ส่งผลกระทบต่อไดเรกทอรีปัจจุบันที่ฉันเป็น

ฉันจะ chown และ chmod ไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันได้อย่างไร


man chownและman chmodตอบคำถามของคุณได้อย่างง่ายดาย
ชิ

2
@Shi ฉันคิดว่ามันเป็นคำถามที่ยุติธรรม การอ่านหน้าคนนั้นคงไม่ช่วยอะไร globbingchmodไม่ได้เป็นส่วนหนึ่งของ มันสร้างขึ้นเพื่อเปลือก นอกจากนี้การอ่านเอกสารเกี่ยวกับ globbing ทำให้ชีวิตของคุณ (ฉันใช้เวลามากในการหาคุณสมบัติทั้งหมดของ zsh)
djf

1
@djf:chown -R user:group .
ชิ

คำตอบ:


96

คุณต้องการใช้chown username:groupname *และให้เชลล์ขยาย*ไปยังเนื้อหาของไดเรกทอรีปัจจุบัน สิ่งนี้จะเปลี่ยนการอนุญาตสำหรับไฟล์ / โฟลเดอร์ทั้งหมดในไดเรกทอรีปัจจุบัน แต่ไม่ใช่เนื้อหาของโฟลเดอร์

คุณสามารถทำได้เช่นchown -R username:groupname .กันซึ่งจะเปลี่ยนการอนุญาตในไดเรกทอรีปัจจุบันและจากนั้นย่อส่วนภายในของมันและโฟลเดอร์ย่อยทั้งหมดเพื่อเปลี่ยนการอนุญาต

chown -R username:groupname *จะเปลี่ยนการอนุญาตในไฟล์และโฟลเดอร์ทั้งหมดซ้ำในขณะที่ออกจากไดเรกทอรีปัจจุบันเพียงอย่างเดียว สไตล์นี้และสไตล์แรกเป็นสิ่งที่ฉันพบว่าตัวเองใช้บ่อยที่สุด


2
@Andrew ระวังของคุณแม้ว่าเขาสามารถเป็นทั้งเพื่อนและศัตรูกับความเหนื่อยล้าหรือไม่ได้เตรียมตัวไว้
Darth Android

5
นอกจากนี้ระวังอันตรายจากช่วงเวลา ตามที่วางไว้ถัดจาก "/" almight บนแป้นพิมพ์ การพิมพ์ผิดง่ายสามารถเปิดเข้าไปchown -R username:groupname . chown -R username:groupname /ทำภารกิจ 2 วินาทีฝันร้าย 2 วัน
teynon

@ ทอมนั่นเป็นเหตุผลว่าทำไมฉันควรเริ่มใช้-vคำสั่งแบบเรียกซ้ำทั้งหมดของฉัน แต่ขี้เกียจเกินไป
Kolob Canyon

เพียงแค่ upvoted เป็น Anwser ที่ดีที่สุดและรัดกุมมากที่สุดถึงแม้ว่าฉันจะเฉพาะเจาะจงและชื่อไดเรกทอรีเพียงเพื่อหลีกเลี่ยงการลื่นของแป้นพิมพ์:chown -R username:groupname directoryname
เดฟ Everitt

9

ฉันคิดว่าคุณต้องการสิ่งนี้:

chown username:groupname *

หากคุณต้องการเปลี่ยนไดเรกทอรีย่อยซ้ำคุณจะต้องสวิตช์-R( -rเลิกใช้งาน):

chown -R username:groupname *


0

chownดีมากถ้าคุณเป็น superuser ฉันมีปัญหาว่ามีคนอื่นทำงานmakeในไดเรกทอรีของฉันและตอนนี้เป็นเจ้าของไฟล์บางอย่างที่ฉันไม่สามารถแก้ไขได้ นี่เป็นวิธีแก้ปัญหาของฉันซึ่งจัดการไฟล์และไดเรกทอรีแม้ว่ามันจะทิ้งไดเรกทอรีไว้รอบ ๆ ด้วยคำต่อท้าย.mkmeownerหากไม่สามารถลบออกได้

  • สคริปต์ต่อไปนี้จะเปลี่ยนความเป็นเจ้าของของไฟล์และไดเรกทอรีที่ส่งไปเป็นเจ้าของโดยผู้ใช้ปัจจุบันพยายามที่จะแก้ไขปัญหาการอนุญาตด้วยการทำสำเนาใหม่ของทุกไดเรกทอรีหรือไฟล์ที่ผู้ใช้ปัจจุบันไม่ได้เป็นเจ้าของการลบ (หรือพยายามลบ) ไฟล์ต้นฉบับและเปลี่ยนชื่ออย่างเหมาะสม
  • ความตั้งใจที่จะเป็นตัวย่อของ "ทำให้ฉันเป็นเจ้าของ" ฉันไม่ได้ใช้ขีดเส้นใต้เพราะพวกเขาเจ็บปวดในการพิมพ์

ตัวอย่าง:

% mkmeowner .

% mkmeowner dirpath1 dirpath2
  • มันต้องการสคริปต์ต่อไปนี้mkmeowneroneที่จะอยู่ในเส้นทางของคุณ

mkmeowner:

#!/bin/bash
[ "x$1" == "x-h" ] || [ "x$1" == "x--help" ] && cat << END && exit 0
Usage: $0 dirorfile [direorfile2 ...]:
    change ownership of directories or files to current user.
    Current user must have permissions to read those and write to owner directory.
END
mkmeownerone=`which mkmeownerone`
for d in $*; do
    find "$d" -not -user `whoami` -exec $mkmeownerone {} \;
done

mkmeownerone:

#!/bin/bash
# change ownership of one file or directory
f="$1"
expr match "${f}" '.*\.mkmeowner$' > /dev/null && exit 1 # already tried to do this one
if mv -f "$f" "${f}.mkmeowner"; then
    cp -pr "${f}.mkmeowner" "$f" && rm -rf "${f}.mkmeowner"
    exit 0
fi
exit 1

1
(1) เราต้องการคำตอบที่มีคำอธิบายบางอย่าง ฉันประหลาดใจเมื่อฉันอ่านสคริปต์ของคุณและเห็นสิ่งที่พวกเขาทำเพราะย่อหน้าเกริ่นนำของคุณไม่ได้ให้เบาะแสกับฉัน (2) คุณลืมที่จะพูดถึงว่าผู้ใช้จะต้องใส่mkmeowneroneในเส้นทางการค้นหา  mkmeownerจะระเบิดหากยังไม่เสร็จ (3) โปรดเรียนรู้วิธีใช้ (เช่นเวลาและสถานที่) ในการใช้อัญประกาศในคำสั่งเชลล์และสคริปต์ การพูดว่า${f}ไม่ใช่ทางเลือกที่มีประโยชน์ ดูนี่สิ … (ต่อ)
สก็อต

(ต่อ) ... (4) หากคุณเรียกใช้สคริปต์ของคุณในไดเรกทอรีมันอาจจะคัดลอกทุกไฟล์ในไดเรกทอรีนั้นสองครั้ง (5)  exprโบราณวัตถุ การจับคู่สตริงแบบง่าย ๆ มีประสิทธิภาพมากกว่าในเชลล์ bash ยังรองรับการจับคู่นิพจน์ปกติ สำหรับเรื่องที่คุณสามารถทำทดสอบในชื่อไฟล์find. (6) ของคุณexpr matchทดสอบคำสั่งไม่ว่าจะ${f}จบลงด้วยการไม่ว่าจะจบลงด้วยการmkmeowner .mkmeownerดังนั้นสคริปต์จะไม่ทำงานกับตัวเอง … (ต่อ)
สก็อต

(ต่อ) ... ตอนนี้เนื้อหานี้เป็นสิ่งที่ดี - คุณไม่ต้องการย้ายและอาจลบสคริปต์ขณะที่ทำงานอยู่ (มันไม่จำเป็นต้องทำให้เกิดปัญหา แต่มันอาจยุ่งเหยิง) แต่คุณควรเข้าใจ (และเอกสาร) กรณีพิเศษเช่นนั้น (7) คุณอาจต้องการใช้เครื่องหมายขีดล่างในสตริงที่มีหลายคำ  dirorfileอ่านและเข้าใจได้ยาก (เทียบกับdir_or_file) และเมื่อฉันเห็นmkmeownerความคิดแรกของฉันคือแมว ( mk +  meow +  ner)
สกอตต์

ขอบคุณสำหรับบันทึกสกอตต์ 1. ฉันคิดว่าฉันมีคำอธิบาย แต่ให้ฉันชัดเจนกว่านี้ 2. จุดดี ฉันได้บันทึกสิ่งนั้นไว้ในสคริปต์ดั้งเดิมของฉัน แต่เอาการอ้างอิงออกมา 3. ฉันได้เขียนเชลล์สคริปต์มา 30 ปีแล้ว แต่แน่นอนฉันจะพยายามเรียนรู้เพิ่มเติม 4. ใช่ โดยเจตนาเพราะหากฉันไม่ได้เป็นเจ้าของไดเรกทอรีฉันไม่สามารถลบมันได้ ฉันสามารถพูดได้ว่า 5. ย่ะฉันแก่แล้ว แต่ expr ก็ยังใช้งานได้ดี 6. ฮา ๆ ๆ 7. ฉันอาจฉันคิดว่า II ได้รับใบอนุญาตทางศิลปะ แต่เนื่องจากขีดเส้นใต้ไม่ใช่กฎ ฉันต้องการสคริปต์ที่ทำให้ meows!
sbcondor

ฉันไม่คิดว่ามีอะไรผิดปกติกับ $ {f} ใช่ไหม มันใช้เวลานานเกินความจำเป็นเล็กน้อย เป็นรูปแบบที่ฉันใช้บ่อยเพราะฉันอาจต้องการใช้ตัวแปรเพื่อสร้างสตริงที่ยาวกว่าเช่น $ {f} .mkmeowner และฉันไม่ต้องจำว่า $ f.heck หมายถึง $ {f} + heck หรือ $ { f.heck}
sbcondor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.