Mode rekursif hanya berfungsi pada direktori, bukan file. Dengan menggunakan glob '* .pdf', shell mengirimkan daftar file ke chown, yang melihat ini adalah file, dan mengubah izin pada file yang dilihatnya, dan hanya itu.
Ingat, di shell, glob dievaluasi oleh shell, bukan perintah. Jika glob cocok dengan file, mereka diteruskan ke perintah dan perintah tidak pernah tahu ada glob. (Ini berbeda dari bagaimana Windows Command prompt digunakan untuk melakukan sesuatu). Jika Anda memiliki dir, dengan isinya sesuatu seperti:
machine:$ ls -F
file1.pdf file2.pdf other.txt subdir/
Dan Anda mengetik:
chown -R someuser:somegroup *.pdf
Shell pertama-tama akan membuat daftar: file1.pdf file2.pdf
dan kemudian jalankan perintah Anda:
chown -R someuser:somegroup file1.pdf file2.pdf
Lihat, tidak ada direktori untuk -R untuk ditindaklanjuti. Itu melakukan apa yang Anda tanyakan - mengubah kepemilikan pada dua file pada baris perintah, mengabaikan bendera -R yang unik.
Untuk melakukan apa yang Anda inginkan, untuk menggunakan '* .pdf' sebagai pola untuk direktori dan subdirektori ini, Anda dapat menggunakan find
, yang dapat menemukan file yang cocok dengan pola nama file (atau banyak kriteria lain) dan meneruskan ke subperintah.
find . -type f -name '*.pdf' | xargs chown someuser:somegroup
Ini dimulai dengan dir saat ini '.' untuk mencari file (tipe file f) dari pola nama '*.pdf'
kemudian beralih ke xargs, yang membangun sebuah baris perintah ke chmod. Perhatikan tanda kutip di sekitar pola '*.pdf'
, ingat bahwa shell akan membuat gumpalan jika bisa, tetapi Anda ingin pola itu diteruskan find
, jadi Anda perlu mengutipnya.
Karena nama file mungkin memiliki spasi di dalamnya, Anda ingin menggunakan trik untuk menjadikannya nama file-dengan-spasi:
find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup
Dalam bash 3 dan lebih rendah, ini adalah cara yang perlu Anda lakukan. Globbing yang lebih kuat tersedia di bash 4 (dengan shopt -s globstar
) dan cangkang lainnya. Hal yang sama di zsh, menggunakan bola rekursif **
:
chown -R someuser:somegroup ./**/*.pdf
shopt -s globstar
globbing rekursif.Ini akan berlaku untuk semua file dan semua subdirektori dan subdirektori dari folder yang ditentukan. Gunakan dengan hati-hati.
sumber
sudo chown -R user ./
bekerja untuk saya, tetapisudo chown -R user ./*
tidak.env
.Anda dapat menggunakan
find
utilitas:Tolong jangan lupa tanda kutip di sekitar
*.pdf
. Kalau tidak, shell akan mencoba mengembangkannya. Ini berarti shell akan diganti*.pdf
dengan nama-nama semua file PDF yang ditemukan di direktori saat ini. Tapi bukan itu yang Anda inginkan. Anda ingin mencari file PDF yang terletak di subdirektori. Btw .: Itu juga masalah denganchown
perintah Anda .sumber
+
, trik untuk kinerja.-exec command {} +
Varian aksi -exec ini menjalankan perintah yang ditentukan pada file yang dipilih, tetapi baris perintah dibangun dengan menambahkan setiap nama file yang dipilih di akhir; jumlah total doa perintah akan jauh lebih sedikit daripada jumlah file yang cocok. Baris perintah dibangun dengan cara yang sama dengan yangxargs
membangun baris perintahnya. Hanya satu instance dari{}
yang diizinkan dalam perintah. Perintah dijalankan di direktori awal.Perintah
hanya akan mengulang direktori jika nama direktori berakhir dengan .pdf. Anda membutuhkan sesuatu seperti:
sumber
untuk mengubah kepemilikan direktori secara rekursif cukup gunakan:
di sini username = pengguna baru yang harus menjadi pemilik direktori
groupname = grup baru yang harus menjadi pemilik direktori
setiap file / direktori memiliki pemilik pengguna dan pemilik grup
sumber
Saya menggunakan
tree
sebagai gantinya:Juga berhati-hatilah untuk tidak menjalankan chown atau chmod rekursif pada direktori '/' atau direktori sistem lainnya.
sumber
Untuk menjadi pemilik semua file dalam direktori, gunakan
dari pada
atau
yang mungkin tidak berfungsi jika ada terlalu banyak argumen yang dihasilkan oleh * (terlalu banyak file dalam direktori) atau yang tidak masing-masing melakukan apa yang Anda inginkan.
sumber