Як скопіювати файли з папки без самої папки


39

Я намагаюся копіювати файли і папки з A папки без А сам. Наприклад, папка містить наступну:

| file1.txt   
| file2.txt    
| subfolder1   

Виконання наступної команди дає мені неправильний результат:

sudo cp -r /home/username/A/ /usr/lib/B/

Результат -

/usr/lib/B/A/...copied files...

замість..

/usr/lib/B/...copied files...

Як я можу досягти очікуваного без папки початківців

Відповіді:


67

вдосконалений к.п.

cp -r /home/username/A/. /usr/lib/B/

Це особливо чудово, оскільки воно працює незалежно від того, чи вже існує цільовий каталог.

шкаралупа

Якщо в каталозі не так вже й багато об'єктів, ви можете використовувати глобальну оболонку:

mkdir -p /usr/lib/B/
shopt -s dotglob
cp -r /home/username/A/* /usr/lib/B/

rsync

rsync -a /home/username/A/ /usr/lib/B/

В /кінці вихідного шляху важливе значення; працює незалежно від того, існує вже цільовий каталог.

знайти

mkdir -p /usr/lib/B/
find /home/username/A/ -mindepth 1 -maxdepth 1 -exec cp -r -t /usr/lib/B/ {} +

або якщо вам не потрібні порожні підкаталоги:

find /home/username/A/ -mindepth 1 -type f -exec cp --parents -t /usr/lib/B/ {} +

(без mkdir)


Перший працює чудово! Будь-які ідеї, чому домашнє ім’я / ім’я користувача / A / * (із символом зірки) не має сенсу? Варіант з крапкою в кінці допоміг мені, дякую!
pushandpop

@pushandpop A/*має сенс, але є ситуації, коли це не працює.
Hauke ​​Laging

3
shoptє bashспецифічним. З zsh, використовувати *(D). з ksh93, FIGNORE='@(.|..)'. cp -tє специфічним для GNU Той findне буде працювати належним чином, оскільки він буде копіювати A/і його вміст (включаючи підкаталоги) кілька разів.
Стефан Хазелас

1
Ви також хочете -maxdepth 1( -mindepthі -maxdepthтепер розширення GNU також підтримуються декількома іншими. Портативно find .../. ! -name . -prune -exec ....)
Stéphane Chazelas

@ StéphaneChazelas Я думаю, десь є друкарська помилка. find .../.викликає помилку тут.
Hauke ​​Laging

10

Якщо в системі GNU man cp:

   -T, --no-target-directory
          treat DEST as a normal file

Це дозволяє писати, cp -rT /home/username/A/ /usr/lib/B/щоб робити саме правильно.


Це має бути прийнятою відповіддю, це правильно, ніж обшивка оболонки або використання чогось іншого, ніж cp. Але це правда, що -Tне буде працювати з не GNU cp.
noraj

3

Скажіть cpскопіювати вміст каталогу, а не сам каталог:

sudo cp -r /home/username/A/* /usr/lib/B/

Спасибі! Але там сказано: / usr / lib / B / - це не каталог
pushandpop

Для цього вам потрібно буде shopt -s dotglobпрацювати, якщо в ньому є якісь точкові файли /home/username/A/.
бесіда

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