แตกไฟล์และโฟลเดอร์ด้วยสิทธิ์ที่ระบุ


11

ฉันแพ็คโฟลเดอร์ที่มีโฟลเดอร์ย่อยและไฟล์จำนวนมากใน Windows ด้วย 7zip, อัปโหลดไปยัง VPS แล้วเรียกใช้คำสั่ง:

tar -xvzf file.tar.gz

จากนั้นไฟล์และโฟลเดอร์ที่แตกไฟล์ทั้งหมดจะได้รับอนุญาตจาก 777 ฉันจะได้รับมันได้อย่างไรเพื่อที่โฟลเดอร์จะได้รับอนุญาตจาก 755 และไฟล์ 644


มีเว็บไซต์ที่เรียกว่า "Command Line Fu" ที่มีแนวคิดอื่น ๆ มากมาย
djangofan

คำตอบ:


13

หากคุณใช้งานtar(1)เป็นผู้ใช้ปกติระบบจะใช้งานumaskตามค่าเริ่มต้นของคุณ หากคุณกำลังใช้tar(1)เป็นrootแล้วคุณสามารถให้--no-same-permissionsเลือกบรรทัดคำสั่งที่จะขอที่จะเคารพtar(1)umask

ดังนั้น: ให้รันสิ่งนี้ในฐานะผู้ใช้ปกติ:

umask 022
tar zxvf file.tar.gz

หรือเรียกใช้สิ่งนี้เป็นroot:

umask 022
tar zxvf file.tar.gz --no-same-permissions

คุณอาจต้องการที่จะติดumask 022เข้าไปในของคุณ~/.bashrc, หรือ~/.bash_profile ~/.profile(ดูbash(1)manpage สำหรับรายละเอียดเกี่ยวกับไฟล์เริ่มต้นมันซับซ้อน)

รายละเอียดเกี่ยวกับumaskสามารถพบได้ใน manpage ของเชลล์ของคุณ manpage การumask(2)เรียกระบบหรือumask(1posix)POSIX ที่มาพร้อมกับยูทิลิตี้ manpage (ถ้าคุณมีการmanpages-posixติดตั้ง)


umask 022 tar zxvf file.tar.gz -> นี่ขอให้ฉันยืนยันสำหรับแต่ละไฟล์แยกต่างหากถ้าฉันต้องการแยกมัน

คุณเขียนทับไฟล์ที่มีอยู่เมื่อทำเช่นนั้นหรือไม่?
sarnold

6

รันคำสั่งต่อไปนี้ในรูทของไดเรกทอรีเพื่อตั้งค่าการอนุญาตที่ต้องการสำหรับไดเรกทอรีและไฟล์ของคุณ:

find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

ระวังช่องว่างระหว่างวงเล็บปีกกาปิดกับเครื่องหมายทับด้านหลัง


find: อาร์กิวเมนต์ที่หายไปกับ `-exec '

ความคิดใดว่าทำไมคำสั่งนี้บอกฉันว่า "ค้นหา: ไม่มีอาร์กิวเมนต์สำหรับ` -exec '" ขอบคุณ

เพิ่มช่องว่างระหว่างวงเล็บปีกกาปิดและ\;
poussma

2

หากคุณใช้ capital X ในchmodคุณสามารถใช้เพื่อตั้งค่าการอนุญาตให้ใช้งานบนไดเรกทอรีเท่านั้น กล่าวคือ

chmod -R ugo+X .

1

ฉันพบโซลูชันนี้ที่ใช้งานได้สำหรับฉัน สำหรับโฟลเดอร์และโฟลเดอร์ย่อย:

chmod -R 777 */

และสำหรับไฟล์ทั้งหมด (เช่นในโฟลเดอร์และโฟลเดอร์ย่อย):

find . -type f -name "*" | xargs chmod 644

ความคิดเห็นทั้งหมดยินดีหากนี่ไม่ใช่วิธีที่ดีในการทำ ฉันเพิ่งเริ่มเรียนรู้ Linux

ความเห็นต่อไปนี้เป็นโซลูชั่นที่มีประสิทธิภาพมากขึ้นที่จัดการตัวละครพิเศษอย่างจะเป็น:

find . -type f -print0 | xargs -0 chmod 644  # For files
find . -type d -print0 | xargs -0 chmod 755  # For directories

แต่คำสั่งที่สองให้ฉันกับหลาย ๆ ไฟล์ที่เอาต์พุตนี้: chmod: ไม่สามารถเข้าถึงthe': No such file or directory chmod: cannot access Logo.txt ': ไม่มีไฟล์หรือไดเรกทอรี chmod: ไม่สามารถเข้าถึง `./blog/wp-content/themes/OneRoom/LOGO': ไม่มีไฟล์ดังกล่าวหรือ di

2
777เป็นสิ่งที่อันตรายและมีผลบังคับใช้กับระบบส่วนน้อยเท่านั้น
sarnold

2
เพื่อปรับปรุงคำสั่งที่สองของคุณ, find . -type f -print0 | xargs -0 chmod 644. -name "*"ไม่จำเป็นและxargs(1)จะแยกชื่อไฟล์ในช่องว่างหรือบรรทัดใหม่จนกว่าคุณจะใช้-0- ซึ่งจะแยกวิเคราะห์ชื่อไฟล์บน ASCII NULตัวอักษรที่ไม่สามารถปรากฏในชื่อไฟล์ -print0สำหรับfind(1)ขอให้จัดรูปแบบเอาท์พุทในโหมดที่เหมาะสมสำหรับxargs -0การป้อนข้อมูล
sarnold

0

หา -type f -exec chmod 644 {} \;


2
ยินดีต้อนรับสู่ Superuser โปรดรับคำตอบ 1 บรรทัดไม่ค่อยได้รับการตอบคุณสามารถอธิบายเพิ่มเติมเกี่ยวกับคำตอบของคุณได้ไหม?
50-3
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.