Bir dizinin tamamını kopyalamak için install komutuyla ilgili sorun


16

Bazı yapılandırma dosyaları ile bir repo var ve ben makefilehomedir onları yüklemek için bir oluşturmaya çalışıyorum . Sahip olduğum sorun şu komutu doğrudan bash'da çalıştırdığımda

install -m 755 -d ~/path/to/dotfilesDir/ ~/

görünüşe göre hiçbir şey olmuyor

install -m 755 ~/path/to/dotfilesDir/{file1,file2,...} ~/

istendiği gibi çalışır.

İlk (daha kolay ve daha temiz) çözüm neden çalışmıyor?



Ben sadece -r ile cp kullandım. Gerçekten neden cp var gibi -r seçeneği yükleme dont anlamıyorum.
ibrahim

Yanıtlar:


7

Man sayfasına baktığınızda, installistediğinizi yapmayacak gibi görünüyor .

Gerçekten de Özet, formun bir kullanımını belirtir:

install [OPTION]... -d DIRECTORY...

ve daha sonra, man sayfası şöyle diyor:

-d, --directory
tüm bağımsız değişkenlere dizin adı olarak davranır; belirtilen dizinlerin tüm bileşenlerini yarat

Bana öyle geliyor ki, bu seçeneğin amacı karmaşık (ama boş) bir dizin yapısını kurabilmektir mkdir -p ....

İstediğiniz şeyi bir döngü ile gerçekleştirebilirsiniz:

for file in /path/to/DotFiles/dir/*;do
    install -m 755 "$file" ~/
done

Ya da, altında birçok seviye varsa /path/to/DotFiles/dir, şunları kullanabilirsiniz find:

find /path/to/DotFiles/dir/ -type f -exec 'install -m 755 "{}" ~/' +

Belirtilen dizinlerin tüm bileşenlerini oluştur = Dosyaları değil alt dizinleri oluştursun mu?
nathdwek

@nathdwek Doğru. Bu şekilde, ana dizininizi kullanarak karmaşık (iskelet) bir dizin yapısı oluşturabilirsinizinstall -m 755 -d ~/foo/bar/baz
Joseph R.

1
-exec 'install -m 755 "{}" ~/' +işe yaramayacak, en azından linux'un bazı (hepsi? en?) sürümünde değil. OSX veya başka bir şey üzerinde çalışabilir. Bir oneliner istiyorsanız böyle bir şey kullanmak oldukça basittir: 1. özyinelemeli dizinler oluşturmak: for d in $(find . -type d); do install -d --mode 755 "$d" "../install-test/$d"; done2. özyinelemeli dosyalar oluşturmak:for f in $(find . -type f); do install -D --mode 644 "$f" ../install-test/; done
Josh M.

6

@Joseph R.'nin cevabından başlayarak, komutun çalışmasını sağlayamadığım için bulmayla çalışmasını sağlamak için bu benim çözümüm. (Bunun geçerli olduğunu düşünmüyorum, çünkü uygulanan kurallar \+: {}öğeden sonra hiçbir şey olamaz .) (Yorum yapamadım. Bu paragrafın tamamı kaldırılabilir.)

Tüm dosyaları tam olarak aynı dizine kopyalamak için (burada target/directory):

find directory/to/copy -type f -exec install -Dm 755 "{}" "target/directory" \;

-D burada zorunlu değildir, sadece hedefe var olmayan dizinleri oluşturur.

Şu anda bulunduğunuz yerden başlayarak bir dizin hiyerarşisinin tamamını ve dosyalarını (bu, boş dizinleri atlar) kopyalamak için:

find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \;

Söylendiği gibi, bu ağaçtan itibaren yeniden yaratacaktır $PWD. Eğer boş bir dizin kopyalamak gerekiyorsa Ayrıca, kullandığınız bir yolunu bulabiliriz -type darasında findve install -d.

Yani, ağacı kopyalamak için olmayan bir dizinden başlayarak $PWD:

(cd parent/directory && find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \;)

Nasıl parent/directorykopyalanmadığına dikkat edin .

Ekstra

Kullananlar için shell/fish, aynı şeyi yapan çizgi:

fish -c 'cd parent/directory; and find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \\;'
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.