Özenle yapılan işleri nasıl yapabilirim?


285

Aradım bir dizin var pdfsalt ve alt alt dizinleri bir demet içerir. Tüm alt klasörlerdeki tüm PDF dosyalarının sahipliğini değiştirmek istiyorum. Bunu yeni denedim:

chown -R someuser:somegroup *.pdf

... ancak alt dizinlerdeki PDF’lerin sahipliğini değiştirmedi. Kullanıcı ve grup var.

İçin man sayfasına göre chown, -Rözyinelemeli demek gerekir:

-R, --recursive
          operate on files and directories recursively

Neyi kaçırıyorum?

Yanıtlar:


292

Özyinelemeli mod yalnızca dizinlerde çalışır, dosyalarda çalışmaz. '* .Pdf' globunu kullanarak kabuk, dosya listesini chown'a geçirir, ki bunlar dosya görür ve gördüğü dosyalardaki izinleri değiştirir ve hepsi bu kadar.

Unutmayın, kabuklarda, küre komut tarafından değil kabuk tarafından değerlendirilir. Eğer glob dosyalarla eşleşirse, komuta geçer ve komut bir globun var olduğunu asla bilemez. (Bu, Windows Komut isteminin işleri yapmak için kullandığından farklıdır). Bir kir varsa, içeriği ile bir şey:

machine:$ ls -F
file1.pdf  file2.pdf  other.txt  subdir/

Ve sen yazdın:

chown -R someuser:somegroup *.pdf

Kabuk ilk önce listeyi yapar: file1.pdf file2.pdf

ve sonra komutunu çalıştırın:

chown -R someuser:somegroup file1.pdf file2.pdf

Gördüğün gibi -R'nin çalışması gereken bir dizin yok. İstediğiniz şeyi yapar - komut satırındaki iki dosyadaki sahipliği değiştirerek ilginç -R bayrağını yok sayarak.

İstediğiniz şeyi yapmak için, '* .pdf' finddosyasını bu dizin ve alt dizinler için bir kalıp olarak kullanmak için , bir dosya adı desenine uyan (veya diğer birçok ölçüt) dosyaları bulabilen ve bir alt komuta geçirebilen kullanabilirsiniz.

find . -type f -name '*.pdf' | xargs chown someuser:somegroup

Bu, şu anki dir 'ile başlar. isim desenindeki dosyaları (filetip f) aramak için '*.pdf'chmod komut satırı oluşturan xargs komutuna geçer. Desenin etrafındaki tırnaklara dikkat edin, '*.pdf'kabuğun yapabiliyorsa bir küre oluşturacağını unutmayın; ancak kalıbın iletilmesini istiyorsanız, findalıntı yapmanız gerekir.

Dosya adlarında boşluklar olabileceğinden, boşluklarla dosya adını güvenli hale getirmek için bir numara kullanmak istersiniz:

find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup

Bash 3 ve daha düşüklerde, yapmanız gereken budur. Bash 4 (with shopt -s globstar) ve diğer kabuklarda daha güçlü globbing mevcuttur . Özyinelemeli bir glob kullanarak, zsh aynı **:

chown -R someuser:somegroup ./**/*.pdf

1
4 bash ile shopt -s globstarbirlikte özyinelemeli globbing yapmak için düzenlenmiştir.
kojiro

@kojiro teşekkürler! söyleyebileceğin gibi hala bash3 kullanıyorum
Rich Homolka

2
Orijinal posterin gösterdiği man sayfasına göre, chown'u buldum -R gerçekten klasörlerde ve dosyalarda sahibini değiştirdi. Bulmana gerek yok. Nane 15'i kullanma
gwideman 28:13

@gwideman Bunun eski olduğunu biliyorum ... Ama evet, elbette -R özyinelemeli. OP sadece "dosya türüne dosyası olan" tek filtrelenmiş özyinelemeye çok özel tip, bir uzantısı ve bir sorun vardı
Zengin Homolka'yı

@RichHomolka Ah. OP, dosyaların 'pdfs' adındaki bir dizinde olduğunu söyledi, bu yüzden sorunun pdfs'nin yinelenecek dizin olarak nasıl belirtileceğini ve içerdiği tüm dosyaların pdfs olduğunu, bu yüzden özellikle seçmelerine gerek olmadığını varsaydım. Ancak, eğer iş sadece pdf dosyalarını seçmek ve diğerlerini değiştirmeden bırakmak istiyorsanız, haklı olabilirsiniz.
gwideman

52
chown -R someuser:somegroup /your/folder/here/*

Bu, tüm dosyalara ve tüm alt dizinlere ve belirtilen klasörün alt alt dizinlerine chown uygulayacaktır. Dikkatli kullanın.


2
Her nasılsa sudo chown -R user ./benim için çalıştı, ama sudo chown -R user ./*yapmadı
Slav

1
Bunun eski olduğunu biliyorum, ancak bu başlığa cevap veriyor olsa da soruyu yanıtlamıyor. Bu aslında OP'nin denediklerinden biraz daha kötü.
Rich Homolka

2
@RichHomolka Buraya sadece soru başlığı nedeniyle getirildikten sonra, bu cevabı bulmaya çok sevindim.
Félix Gagnon-Grenier

@ FélixGagnon-Grenier yeterince adil. Bu cevap sizin için işe yararsa çok mutluyum. Fakat asıl soru için işe yaramazdı.
Rich Homolka

Bu gibi nokta dosyaları için işe yaramaz gibi görünüyor .env.
Ryan

14

findYardımcı programı kullanabilirsiniz :

find . -name '*.pdf' -exec chown someuser:somegroup {} +

Lütfen etrafındaki alıntıları unutma *.pdf. Aksi halde kabuk onu genişletmeye çalışacaktır. Bu, kabuğun zaten *.pdfgeçerli dizinde bulunan tüm PDF dosyalarının adlarıyla değiştirileceği anlamına gelir . Ama istediğin bu değil. Alt dizinlerde bulunan PDF dosyalarını bulmak istiyorsunuz. Btw .: Emrinizde de sorun var chown.


1
+Performans için düzgün bir numaraya bakmak zorunda kaldım . -exec command {} +-Exec eyleminin bu değişkeni, seçilen dosyalarda belirtilen komutu çalıştırır, ancak komut satırı, seçilen her dosya adını sonuna ekleyerek oluşturulur; Komutun toplam çağrı sayısı eşleşen dosya sayısından çok daha az olacaktır. Komut satırı, xargskomut satırlarını oluşturanla aynı şekilde oluşturulur. {}Komut içerisinde yalnızca bir örneğine izin verilir. Komut başlangıç ​​dizininde yürütülür.
Patrick M,

@PatrickM bir (küçük) + vs diğer avantajı; .... artı bir kabuk meta karakteri değil ve kaçmak zorunda değil
Rich Homolka

6

Komuta

chown -R someuser:somegroup *.pdf

Yalnızca dizin adı .pdf ile bitiyorsa , dizinleri yineleyecektir. Gibi bir şeye ihtiyacınız var:

find . -name "*.pdf" -exec chown someuser:somegroup {} \;

Teknik olarak sadece bir seviyeye inecek. Bu gerçek özyineleme dediğiniz kullanıcı için bir egzersiz olup olmadığını :)
Rich Homolka

1

Bir dizinin sahipliğini yinelemeli olarak değiştirmek için basitçe kullanın:

sudo chown -R <username>:<groupname> <dir name>

here username = dizin sahibi olması gereken yeni kullanıcı

groupname = dizinin sahibi olması gereken yeni grup

Her dosyanın / dizinin bir kullanıcı sahibi ve bir grup sahibi vardır


Bu OP'nin istediğini yapmaz. Bu, her şeyin mülkiyetini değiştirir, OP belirli bir dosya kümesi istedi.
Rich Homolka,

0

Bunun treeyerine kullanıyorum:

 sudo tree -fai ~/.blabla  | xargs -L1 -I{} sudo chown youruser:youruser {}

Ayrıca '/' dizininde veya başka bir sistem dizininde özyinelemeli chown veya chmod çalıştırmamaya dikkat edin.


0

Bir dizindeki tüm dosyaların sahibi olmak için

find directory -type f -name '*' | sudo xargs -d '\n' chown $USER

onun yerine

sudo chown $USER directory\*

veya

sudo chown --recursive $USER directory

* tarafından üretilen çok fazla sayıda argüman varsa (dizinde çok fazla dosya varsa) işe yaramayabilir veya sırasıyla istediğiniz şeyi yapmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.