Як скопіювати файл у кілька папок за допомогою командного рядка?


67

Я спробував скопіювати файл test.txtу кілька каталогів за допомогою однієї команди:

cp ~/test.txt ~/folder1 ~/folder2

Але мені це не вдалося. Чи є спосіб зробити це в одній команді, щоб я могла скопіювати файл або навіть папку в декілька каталогів?


Не легко. Ви можете розглянути "rsync" для ефективного оновлення декількох існуючих копій папки
Thorbjørn Ravn Andersen

3
Спробуйте вивчити трохи bash-скрипту. Це може стати дуже корисним:for dest in folder1 folder2; do cp ~/test.txt ~/"$dest"; done
Шахбаз

Ні одна команда, але може просто допомогти деяким людям, які натрапляють на це:cp ~/test.txt ~/folder1 && cp ~/test.txt ~/folder2
Ману Ярвінен

Відповіді:


71

cpможе копіювати з декількох джерел, але не може скопіювати у кілька напрямків. Дивіться man cpдля отримання додаткової інформації.

Єдина команда bash, яку я знаю, яка може скопіювати / зберегти на кілька напрямків, - це tee.

Ви можете використовувати його у вашому випадку наступним чином:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt

Зверніть увагу, що teeтакож пише вхід до стандартного виводу (stdout). Тож якщо ви цього не хочете, ви можете запобігти цьому, перенаправляючи стандартний вихід на /dev/nullнаступне:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null

10
Розумний, це обман! :)
terdon

5
+1, розумний! І якщо ви також використовуєте >/dev/nullтвори з бінарними файлами, не псуючи термінал ...
Rmano

1
+1 для вас, ваш завжди чоловік :), але що робити, якщо я хочу скопіювати каталог?
nux

2
@nux Не забудьте скористатися -rопцією cpу випадку каталогів
Radu Rădeanu

4
@nux: teeна відміну від cpкопіювання лише вмісту файлу, ігноруючи його режим, право власності, часові позначки. Щоб уникнути повторення імені файлу:f=text.txt; <~/$f tee ~/folder1/$f > ~/folder2/$f
jfs

61

Ще одним способом досягнення копії в декілька місць є наступна команда:

find dir1 dir2 -exec cp file.txt {} \;

Якщо у dir1 або dir2 є підкаталоги, в які ви не хочете копіювати файл, додайте -maxdepth 0параметр:

find dir1 dir2 -maxdepth 0 -exec cp file.txt {} \;

Зверніть увагу , що це призведе до перезапису всіх файлів в dir1і dir2з file.txt«и зміст, на додаток до копіювання його. Щоб копіювати лише, file.txtне зачіпаючи інші файли в цих каталогах, скажіть findдіяти лише в каталогах:

find dir1 dir2 -type d -exec cp file.txt {} \;

4
Приємне рішення! Мені здається досконалішим, ніж з трійником.
Данатела

1
Дійсно, перенаправлення не бере участь, і це все одно одна команда.
Сільвен Піно

2
@SylvainPineau Насправді є 3: один є findі два рази (в даному випадку) cp. Не кажучи, що findпотрібно багато часу.
Radu Rădeanu

3
Якщо визначення "команди" є викликом "exec", можливо, але це "одна команда" в моїй книзі.
kojiro

2
Я продовжую повертатися до цього, тому подумав, що я повинен дати висновок: D
Джонатан

31

Команда

cp ~/test.txt ~/folder1 ~/folder2

намагається скопіювати два файли ( ~/test.txtі ~/folder1) до місця призначення folder2. (А якщо ~/folder2існує та є каталогом, у вас з’явиться попередження про «пропущуючи каталог»).

Якщо ви хочете зробити кілька копій файлу test.txt, вам доведеться скористатися циклом або декількома командами ...

for i in ~/folder1 ~/folder2; do cp  ~/test.txt $i; done 

(... і будьте обережні, якщо у іменах файлів є пробіли, вам потрібно буде цитувати).

Щоб скопіювати цілі каталоги, ви повинні використовувати -rопцію:

for i in ~/folder1 ~/folder2; do cp -r ~/folder3 $i; done

це створить ~/folder1/folder3і ~/folder2/folder3з усіма включеними файлами.


1
Для читача, що переходить: Відповідно до специфікації , цикл for for - це складна команда. Тому це ще одна команда і відповідає всім вимогам до питання.
kojiro

@nux, я не погоджуюся з виправленнями. 1) дві великі літери помиляються, моя мета полягала в тому, щоб переплутати команди у фразу. 2) еліпсис - це питання стилю; будь ласка, дозвольте мені мій стиль.
Рмано

1
ОК, вибачте, людина, я думав, що це буде виглядати краще.
nux

в моїй системі він не зберігає папку3 як ~ / folder1 / folder3, а скопіює все, що знаходиться в папці3, у folder1
alpha_989

23

Ви можете створити довідковий сценарій, а також виконати xargsфункцію друку (у цьому випадку echo):

echo firstDir secondDir | xargs -n 1 cp test

Це зробить кожен каталог аргументом cpфункції, використовуючи тестовий файл як параметр.


Це, мабуть, найкраща / найпряміша відповідь на питання
Брайсон С.

7

Після тривалого пошуку ця робота, як Чарівність, також!

for dir in *; do [ -d "$dir" ] && cp /path/file.txt "$dir" ; done

Це скопіює файл file.txt у кожен каталог вашого поточного місцезнаходження в терміналі.

for dir in *; do [ -d "$dir" ] && cp -rf /path/folder "$dir" ; done

Це скопіює папку у кожен підкаталог у вашому поточному місці в терміналі.

Я поділяю це сподіванням, що це допомагає і іншим.


В zsh, ви можете використовувати , for i in *(/); ...щоб перебрати всі підкаталоги, так що ви можете уникнути [ -d ...випробування. Розширений глобус - одна з причин, що мені подобається bash.
Рмано

Ви можете правильно ввести код в команді
nux

1
У zshпершій команді цієї відповіді можна спростити як for dir in *(/); do cp /path/file.txt "$dir"; done. Дивіться zsh.sourceforge.net/Intro/intro_2.html
Rmano

5
Ви можете усунути тест у будь-якій оболонці, отриманій від Bourne,for dir in */;
Henk Langeveld

@nux Це працює дуже добре, і команду дуже легко виконувати. За нього слід проголосувати набагато вище!
nukeguy

1

Якщо ви хочете скопіювати файл test.txt у кожен каталог у / tmp / target / ...

створити тестове середовище:

mkdir /tmp/target
cd /tmp/target
mkdir -v {folder1,folder2,folder3}
touch test.txt

скопіюйте його:

find * -maxdepth 0 -type d -exec cp -vi test.txt {} \;

0

Просто думав дати варіацію відповіді Sylvain Pineau

де dir1і dir2немає у вашому поточному каталозі.

find ./ -maxdepth 2 -type d -name dir1 -exec cp file.txt {} \;

тут пошук буде шукати dir1два рівні глибоко, або ви можете залишити -maxdepthпараметр, щоб знайти його dir1у всіх папках у поточному каталозі та під ним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.