Bagaimana saya bisa chmod / chown daftar file tertentu?

31

Saya ingin menulis skrip .sh untuk menyiapkan beberapa izin folder, tetapi bertanya-tanya apakah saya dapat menjalankan sesuatu seperti:

chown -644 ./one;/two;/three

untuk mengetahui daftar folder, daripada memanggil chown beberapa kali.

Juga, akankah ada cara untuk mengetahui daftar file, dan mengecualikan beberapa yang lain, seperti misalnya:

chown -R -664 ./*;!./cache

Saya harap baris perintah semu saya masuk akal.

josef.van.niekerk
sumber

Jawaban:

43

Hampir semua alat Unix menerima daftar file sebagai argumen non-opsi. Seperti biasa, berbagai argumen harus dipisahkan oleh ruang:

chown 644 one two three

Dalam contoh kedua Anda, jika Anda menggunakan Bash, sederhana

chown -R 644 !(cache)

akan cukup.

Pendekatan ini membutuhkan pencocokan pola yang diperluas. Jika dinonaktifkan, Anda dapat mengaktifkannya dengan

shopt -s extglob

Lihat: Manual Referensi Bash # Pencocokan Pola

Dennis
sumber
4

Buat daftar nama file di mod-these.txt dan kemudian jalankan:

chmod g+w `cat mod-these.txt`

atau gunakan metode yang dijelaskan oleh orang lain di sini:

chown 644 one two three

atau pergi ke kota dengan opsi pertama tetapi memanipulasi setiap baris dalam file (dalam contoh ini: ganti "/" (DENGAN spasi putih sebelumnya) dengan "./"):

chmod g+w `sed 's/ \// .\//' update-writable.txt` 
Chonez
sumber
2

regex untuk kemenangan!

menggunakan find adalah cara terbaik yang bisa saya pikirkan di luar menggunakan regex yang mungkin sudah ada di shell khusus Anda atau di dalam aplikasi yang Anda gunakan itu sendiri. pertama, saya mencoba:

touch one&touch two &touch three&find -name "one|two|three" -exec chown -644 {} \;

Tapi, Anda akan menemukan bahwa pipa itu tidak berfungsi dalam kasus ini. Hal menyedihkan lainnya untuk dipelajari ... seperti belajar chmod, chown, chgrp, et. Al. tidak mendukung pemilihan multi-file / regex / pengecualian sendiri ...
Solusi yang saya temukan:
/programming/19111067/regex-match-either-string-in-linux-find-command

find \( -name one -o -name two -o -name three \) -exec chown -644 {} \;

jadi, tidak begitu banyak regex untuk menang, tetapi setidaknya kita memiliki cara untuk menyuntikkan daftar file ke argumen program dalam satu liner.

Anda akan mencatat bahwa Anda perlu keluar dari () meta-karakter, dan penambahan parameter -o untuk setiap nama tambahan ...

tautan dan konten lain dari saya yang mungkin menarik bagi Anda di sepanjang perjalanan Anda:
Berbagai informasi menarik - catatan dari korn bourne dan teman-teman. - Situs web Dave Horner

Tepuk tangan.
--Dave

Dave Horner
sumber
KISS menang, Tetap sederhana dan bodoh! tidak perlu hal-hal rumit yang masih bersih dan mudah.
Al-Mothafar
2

Jika file yang ingin Anda modifikasi ada dalam satu direktori, Anda dapat menggunakannya dengan pola yang diperlukan.

mis. Saya perlu semua file .run yang diunduh dalam pwd diubah menjadi yang dapat dieksekusi:

chmod +x `ls *.run`
gat1
sumber