Проблема з командою встановити для копіювання цілого каталогу


16

Тож у мене є репо з деякими моїми конфігураційними файлами, і я намагаюся створити a, makefileщоб встановити їх у homedir. Проблема у мене полягає в тому, що коли я запускаю наступну команду прямо в bash

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

мабуть, поки нічого не відбувається

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

працює за призначенням.

Чому перше (простіше і чистіше) рішення не працює?



Я просто використав cp з -r. Я дійсно не розумію, чому встановити dont have -r варіант, як у CP.
ібрагім

Відповіді:


7

З погляду на сторінку чоловіка здається, що installне буде робити того, що ви хочете.

Дійсно, в розділі "Конспект" вказується на використання форми:

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

а пізніше на сторінці чоловіка написано:

-d, --директорія
трактує всі аргументи як імена каталогів; створити всі компоненти зазначених каталогів

Тож мені здається, що суть цього варіанту полягає в тому, щоб мати можливість встановити складну (але порожню) структуру каталогів à la mkdir -p ....

Ви можете виконати те, що хочете, за допомогою циклу:

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

Або якщо нижче багато рівнів /path/to/DotFiles/dir, ви можете використовувати find:

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

Створити всі компоненти вказаних каталогів = Створити підкаталоги, а не файли?
nathdwek

@nathdwek Вправо. Таким чином ви можете створити складну структуру (скелет) під, скажімо, домашнього каталогу, використовуючиinstall -m 755 -d ~/foo/bar/baz
Джозеф Р.

1
-exec 'install -m 755 "{}" ~/' +не буде працювати, принаймні, не на певній (все? більшості?) версії Linux. Може працювати на OSX або щось подібне. Використовувати щось на кшталт цього досить прямо, якщо вам потрібен онлайнер: 1. створюйте каталоги рекурсивні: for d in $(find . -type d); do install -d --mode 755 "$d" "../install-test/$d"; done2. створюйте рекурсивні файли:for f in $(find . -type f); do install -D --mode 644 "$f" ../install-test/; done
Джош М.

6

Починаючи з відповіді @Joseph R., це моє рішення змусити його працювати з пошуку, так як я не міг змусити його командування працювати. (Я не думаю, що це відбувається через правила, що застосовуються до \+: після {}елемента не може бути нічого .) (Я не міг прокоментувати. Весь цей абзац можна фактично видалити.)

Щоб скопіювати всі файли в той самий каталог (тут target/directory):

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

-D тут не є обов'язковим, він просто створить неіснуючі каталоги до цілі.

Щоб скопіювати всю ієрархію каталогів та її файли (це опустить порожні каталоги), починаючи з того місця, де ви зараз перебуваєте:

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

Як було сказано, це відтворить дерево, починаючи з $PWD. Крім того , якщо вам потрібно скопіювати порожній каталог, на міг знайти спосіб , використовуючи -type dв findі install -d.

Отже, щоб скопіювати дерево, починаючи з каталогу, який не є $PWD:

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

Зверніть увагу, як parent/directoryне скопійовано.

Додатково

Для тих, хто використовує shell/fish, ось такий рядок:

fish -c 'cd parent/directory; and find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \\;'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.