Masalah dengan perintah instal untuk menyalin seluruh direktori

16

Jadi saya punya repo dengan beberapa file konfigurasi saya dan saya mencoba membuat makefileuntuk menginstalnya di homedir. Masalah yang saya miliki adalah ketika saya menjalankan perintah berikut langsung dalam bash

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

sepertinya tidak ada yang terjadi sementara

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

berfungsi sebagaimana dimaksud.

Mengapa solusi pertama (lebih mudah dan lebih bersih) tidak berfungsi?

nathdwek
sumber
Saya hanya menggunakan cp dengan -r. Saya benar-benar tidak mengerti mengapa menginstal tidak memiliki opsi -r seperti cp miliki.
ibrahim

Jawaban:

7

Dari melihat halaman manual , tampaknya itu installtidak akan melakukan apa yang Anda inginkan.

Memang, bagian Sinopsis menunjukkan penggunaan formulir:

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

dan kemudian, halaman manual mengatakan:

-d, --directory
memperlakukan semua argumen sebagai nama direktori; buat semua komponen direktori yang ditentukan

Jadi menurut saya poin dari opsi ini adalah untuk dapat menginstal struktur direktori yang rumit (tapi kosong) à la mkdir -p ....

Anda dapat mencapai apa yang Anda inginkan dengan satu lingkaran:

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

Atau, jika ada banyak level di bawah /path/to/DotFiles/dir, Anda dapat menggunakan find:

find /path/to/DotFiles/dir/ -type f -exec 'install -m 755 "{}" ~/' +
Joseph R.
sumber
Buat semua komponen dari direktori yang ditentukan = Buat subdir tapi bukan file?
nathdwek
@nathdwek Benar. Dengan cara ini Anda dapat membuat struktur direktori (kerangka) yang kompleks di bawah, katakanlah, direktori home Anda menggunakaninstall -m 755 -d ~/foo/bar/baz
Joseph R.
1
-exec 'install -m 755 "{}" ~/' +tidak akan bekerja, setidaknya tidak pada versi linux tertentu (semua? sebagian?). Dapat bekerja pada OSX atau sesuatu. Menggunakan sesuatu seperti ini cukup mudah jika Anda menginginkan oneliner: 1. membuat direktori rekursif: for d in $(find . -type d); do install -d --mode 755 "$d" "../install-test/$d"; done2. membuat file rekursif:for f in $(find . -type f); do install -D --mode 644 "$f" ../install-test/; done
Josh M.
6

Mulai dari jawaban @Joseph R., ini adalah solusi saya untuk membuatnya bekerja dengan find, karena saya tidak bisa membuat perintahnya berfungsi. (Saya rasa tidak, karena aturan yang berlaku untuk \+: tidak ada apa-apa setelah {}elemen.) (Saya tidak bisa berkomentar. Seluruh paragraf ini sebenarnya bisa dihapus.)

Untuk menyalin semua file ke direktori yang sama persis (di sini target/directory):

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

-D tidak wajib di sini, itu hanya akan membuat direktori yang tidak ada ke target.

Untuk menyalin seluruh hierarki direktori dan file-nya (ini akan menghilangkan direktori kosong) mulai dari tempat Anda saat ini:

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

Seperti yang dikatakan, ini akan membuat ulang pohon mulai dari $PWD. Juga, jika Anda perlu menyalin direktori kosong, di dapat menemukan cara menggunakan -type ddari finddan install -d.

Jadi, untuk menyalin pohon, mulai dari direktori yang bukan $PWD:

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

Perhatikan bagaimana parent/directorytidak disalin.

Tambahan

Bagi mereka yang menggunakan shell/fish, inilah baris yang melakukan hal yang sama:

fish -c 'cd parent/directory; and find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \\;'
Vrakfall
sumber