Как скопировать файлы из папки без самой папки

40

Я пытаюсь копировать файлы и вложенные папки из 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...

Как добраться до ожидаемого без origin-папки

pushandpop
источник

Ответы:

67

продвинутый cp

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)

Хауке Лагинг
источник
Первый работает просто отлично! Есть идеи, почему home / username / A / * (со звездочкой) не имеет смысла? Мне помог вариант с точкой в ​​конце, спасибо!
pushandpop
@pushandpop A/*имеет смысл, но есть ситуации, в которых он не работает.
Хауке Лагинг
3
shoptявляется bashспецифичны. С zsh, использовать *(D). с ksh93, FIGNORE='@(.|..)'. cp -tявляется специфическим для GNU. Один findне будет работать должным образом, так как он будет копировать оба A/и его содержимое (включая подкаталоги) несколько раз.
Стефан Шазелас
1
Вы также хотите -maxdepth 1( -mindepthи -maxdepthбудучи расширениями GNU теперь также поддерживаются несколькими другими. Портативно find .../. ! -name . -prune -exec ....)
Стефан Шазелас
@ StéphaneChazelas Думаю, где-то есть опечатка. find .../.вызывает ошибку здесь.
Хауке Лагинг
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/.
Talkloud
1
@pushandpop хорошо, да. Это цель, которую вы задали в своем вопросе, поэтому я предположил, что это каталог. Вам нужно создать цель, прежде чем пытаться скопировать в нее файлы.
Тердон