Копировать файлы из одного каталога в существующий каталог

249

В Bash мне нужно сделать это:

  1. взять все файлы в каталоге

  2. скопировать их в существующий каталог

Как мне это сделать? Я пытался cp -r t1 t2(и t1, и t2 - существующие каталоги, в t1 есть файлы), но он создал каталог с именем t1 внутри t2, я не хочу этого, мне нужны файлы в t1, чтобы перейти непосредственно в t2. Как мне это сделать?

Дэвид Чанг
источник
11
Почему это было закрыто? Это произвольно, если команда bash является встроенной или внешней командой (например, printf существует как в большинстве систем), поэтому cpвопросы можно рассматривать как bashвопросы, то есть язык программирования. Я никогда не видел, чтобы вопрос Python о копировании файла был закрыт.
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
Взгляните на этот stackoverflow.com/questions/23698183/…
theGiallo
Я прибыл в поисках напоминания о синтаксисе команды копирования оболочки Bash, и я рад сообщить, что эти команды, похоже, также работают с базовой файловой системой NTFS в моей установке Windows.
Дэвид А. Грей

Ответы:

397

То, что вы хотите, это:

cp -R t1/. t2/

Точка в конце говорит ему скопировать содержимое текущего каталога, а не самого каталога. Этот метод также включает скрытые файлы и папки.

Ник
источник
2
Мне очень нравится этот синтаксис, но по какой-то причине он не работает mv. Кто-нибудь знает почему?
Мартин фон Виттих,
2
Удивительный. Где это задокументировано? Это POSIX или расширение?
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
9
@CiroSantilli 轩 事件 法轮功 包 卓 轩 Если вы скопируете каталог, cp создаст каталог и скопирует в него все файлы. Если вы используете притворную папку с именем «.», Которая совпадает с папкой, в которой она хранится, копия ведет себя так. Допустим, t1 содержит файл с именем «file». cp выполнит операцию, эквивалентную «cp t1 /./ file t2 /./». Он копирует папку ".", Но копирует файлы в t2 "." папка удаляет "./", потому что "t2 /./" совпадает с "t2 /". Технически это означает, что это встроенное поведение POSIX ... но, вероятно, не так, как вы могли ожидать!
нанес удар
35

Если вы хотите скопировать что-либо из одного каталога в текущий каталог, сделайте это:

cp dir1/* .

Это предполагает, что вы не пытаетесь копировать скрытые файлы.

Карл Гизинг
источник
20
Пропускает скрытые файлы.
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
1
Также происходит сбой для большого количества файлов (потому что '*' не может не расширяться до бесконечного числа файлов ..) y
moritzschaefer
32
cp dir1/* dir2

Или если у вас есть каталоги внутри dir1, которые вы также хотите скопировать

cp -r dir1/* dir2
Бертран Маррон
источник
3
В зависимости от того, как настроена ваша оболочка, вам, вероятно, потребуется использовать «dir1 / * dir1 /.*» вместо «dir1 / *», если вы также хотите перехватывать скрытые файлы.
Соколов
2
Копирование dir1/.*не очень хорошая идея, так как оно копирует dir1 / .. (т.е. родительский каталог каталога, который вы на самом деле пытаетесь скопировать). Также копирует dir1 /. это нормально, за исключением того, что оно уже (в основном) было скопировано, поэтому вы выполняете работу дважды.
Гордон Дэвиссон
1
Вы можете обойти dir1/.*проблему / hidden files, перейдя в каталог, из которого вы хотите скопировать, а затем ссылаясь на него как .. Итак, если вы хотите скопировать все файлы, включая скрытые, из каталога в существующий каталог, вы можете: cd [source dir], cp . [path to destination dir, with no trailing slash].
RobW
8

Предполагая, что t1 - это папка с файлами, а t2 - пустой каталог. То, что вы хотите, это что-то вроде этого:

sudo cp -R t1/* t2/

Помните, что в первом примере t1 и t2 должны быть полными или относительными путями (в зависимости от того, где вы находитесь). Если вы хотите, вы можете перейти к пустой папке (t2) и сделать это:

sudo cp -R t1/* ./

Или вы можете перейти к папке с файлами (t1) и сделать это:

sudo cp -R ./* t2/

Примечание. Знак * (или подстановочный знак) обозначает все файлы и папки. Флаг -R означает рекурсивно (все внутри всего).

Konkret
источник
2
cp -R t1/ t2

Конечная косая черта в исходном каталоге немного меняет семантику, поэтому копирует содержимое, но не сам каталог. Это также позволяет избежать проблем с глобализацией и невидимыми файлами, которые есть в ответе Бертрана (копирование t1/*пропускает невидимые файлы, копирование `t1 / * t1 /.* 'копий t1 /. И t1 / .., которые вам не нужны).

Гордон Дэвиссон
источник
Ваше решение не работает, по крайней мере, не в моей установке (Ubuntu 12.10) $ mkdir t1 $ mkdir t2 $ touch t1/one $ touch t1/two $ touch t1/.three $ cp -R t1/ t2 $ ls t2/ t1 (извините, нет форматирования кода в комментариях, читаемая версия на pastebin.com/yszSxV6G )
zpon
2

В зависимости от некоторых деталей вам может потребоваться сделать что-то вроде этого:

r=$(pwd)
case "$TARG" in
    /*) p=$r;;
    *) p="";;
    esac
cd "$SRC" && cp -r . "$p/$TARG"
cd "$r"

... это в основном меняет каталог SRC и копирует его в цель, а затем возвращает обратно туда, откуда вы начали.

Дополнительная суета заключается в обработке относительных или абсолютных целей.

(Это не зависит от тонкой семантики самой cpкоманды ... о том, как она обрабатывает спецификации исходного кода с / без трейлинга / ... так как я не уверен, что они стабильны, переносимы и надежны за пределами только GNU cpи I не знаю, будут ли они продолжаться в будущем).

Джим Деннис
источник
1

Внутри некоторого каталога это будет использоваться полностью, так как копирует все содержимое из «folder1» в новый каталог «folder2» внутри некоторого каталога.

$ (pwd) получит путь для текущего каталога.

Обратите внимание на точку (.) После folder1, чтобы получить все содержимое в folder1

cp -r $(pwd)/folder1/. $(pwd)/folder2
Бидяшиш Кумар
источник