Скопіюйте файли з одного каталогу в існуючий каталог


248

У bash мені потрібно це зробити:

  1. взяти всі файли в каталозі

  2. скопіюйте їх у існуючий каталог

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


11
Чому це було закрито? Довільно, якщо команда bash є вбудованою або зовнішньою командою (наприклад, printf існує як обидві в більшості систем), тому cpпитання цілком можна розглядати як bashпитання, що є мовою програмування. Я ніколи не бачив питання Python, який говорив про закриття копії файлів.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Подивіться на цю stackoverflow.com/questions/23698183 / ...
theGiallo

Я прийшов у пошуках нагадування про синтаксис команди копіювання оболонки Bash, і я радий повідомити, що ці команди, здається, також працюють проти базової файлової системи NTFS на моїй установці Windows.
Девід А. Грей

Відповіді:


396

Що ви хочете, це:

cp -R t1/. t2/

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


2
Мені дуже подобається цей синтаксис, але він чомусь не працює mv. Хтось знає, чому?
Мартін фон Віттіх

2
Дивовижний. Де це документально зафіксовано? Це POSIX чи розширення?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

9
@CiroSantilli 六四 事件 法轮功 包 卓 轩 Якщо ви скопіюєте каталог, cp створить каталог і скопіює в нього всі файли. Якщо ви використовуєте папку для виклику під назвою ".", Яка збігається з каталогом, який у ній зберігається, копія поводиться таким чином. Скажімо, t1 містить файл, який називається "файл". cp виконає операцію, еквівалентну "cp t1 /./ файл t2 /./". Це копіювання папки ".", Але копіювання файлів у t2 ". папка знімає "./", оскільки "t2 /./" те саме, що "t2 /". Технічно це означає, що це POSIX побудований на поведінці ... але, мабуть, не так, як ви могли очікувати!
б'ючи

35

Якщо ви хочете скопіювати щось із одного каталогу в поточний каталог, зробіть це:

cp dir1/* .

Це передбачає, що ви не намагаєтесь скопіювати приховані файли.


20
Не вистачає прихованих файлів.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
Також виходить з ладу для великої кількості файлів (оскільки "*" не може розширюватися до нескінченно багатьох файлів ..) y
moritzschaefer

32
cp dir1/* dir2

Або якщо у вас є каталоги всередині dir1, які ви також хочете скопіювати

cp -r dir1/* dir2

3
Залежно від налаштування вашої оболонки, вам, ймовірно, доведеться використовувати "dir1 / * dir1 /.*" замість "dir1 / *", якщо ви також хочете захопити приховані файли.
ssokolow

2
Копіювання dir1/.*не є хорошою ідеєю, оскільки вона копіює dir1 / .. (тобто батьківський каталог каталогу, який ви насправді намагаєтесь скопіювати). Він також копіює dir1 /. що добре, за винятком того, що воно вже (в основному) було скопійовано, тому ви виконуєте роботу двічі.
Гордон Девіссон

1
Ви можете dir1/.*усунути проблему / приховані файли, ввівши в каталог, з якого потрібно скопіювати, а потім посилаючись на це як .. Отже, якщо ви хочете скопіювати всі файли , включаючи приховані файли з каталогу в існуючий каталог, ви можете: 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 означає рекурсивно (все все в усьому).


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і я не знаю, чи будуть вони такими і надалі).


1

Для всередині деякого каталогу це буде повною мірою, оскільки воно копіює весь вміст з "папки1" в новий каталог "папка2" всередині деякого каталогу.

$ (pwd) отримає шлях до поточного каталогу.

Зауважте крапку (.) Після папки1, щоб отримати весь вміст всередині папки1

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