Копіюйте всі файли, крім одного, BASH


110

Я хотів би скопіювати всі файли з режиму, крім одного з ім'ям Default.png. Здається, існує ряд способів зробити це. Що вам здається найбільш ефективним?


Для чого вам потрібно пропустити цей файл, а не просто видалити його після копіювання? Чи існує вона вже в цільовому каталозі?
Лассе В. Карлсен

1
Так, файл з такою ж назвою вже живе в цільовому режимі.
Джо Каннатті

@ LasseV.Karlsen: Або ви можете заощадити час його копіювання, якщо це великий файл. Мене це цікавить, але виключаючи каталог, а не файл.
Nikana Reklawyks

Відповіді:


54

Простий, якщо src/містить лише файли:

find src/ ! -name Default.png -exec cp -t dest/ {} +

Якщо src/є підкаталоги, вони опускають їх, але копіюють файли всередині них:

find src/ -type f ! -name Default.png -exec cp -t dest/ {} +

Якщо src/є підкаталоги, вони не повторюються в них:

find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} +

5
Це виявляється найкращим для мене, оскільки, здається, OS X постачається без глобуса.
Джо Каннатті

6
@Max \;виконує команду один раз на файл. +запускає команду один раз і передає їй всі імена файлів відразу (за умови обмеження довжини командного рядка). +загалом трохи ефективніше.
Джон Кугельман

149

Повинно бути таким:

cp -r !(Default.png) /dest

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

cp -r !(Default.png|example) /example

17
Це призводить до того, що подія
-bash

Ви копіюєте файли в папку, вкладену в папку, з якої копіюєте?
Джон

47
Це вимагає shopt -s extglobроботи, якщо вона була відключена.
Баррі Келлі

5
Здається, що OS X потрібно використовувати, shopt -s extglobяк описано в @BarryKelly. З цим воно прекрасно працює.
Кет

Роки на Баша і не знали про !()... Красиво! Для тих, хто - як я - вважаю, що настав час вивчити / переглянути баш , ось відповідні посилання, пов'язані з цим питанням / відповіддю: shopt / extglob та шаблон .
Брандт

73

rsync тривалий час була моєю cp / scp заміною:

rsync -av from/ to/ --exclude=Default.png

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose               increase verbosity

Якщо я хочу виключити два різних файли, як це використовувати?
Pulkit Bansal

підтримується кілька --exclude = аргументів. І не забувайте -rаргументувати, якщо ви синхронізуєте каталоги
Rian Sanderson,

5

Я просто зробив би:

cp srcdir/* destdir/ ; rm destdir/Default.png

якщо файли великі. В іншому випадку використовуйте напр

find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/

1
Перша команда - це не те, про що вимагала ОП. Якщо Default.pngіснує в двох каталогах, він замінить той destdir, на який знаходиться srcdir, а потім видалить скопійоване Default.png. Натомість ОП хоче зберегти те, Default.pngщо вже існує destdir.
SnowFrog

2
як щодо default.png вже існує у destdir? Ваш розчинник не працюватиме.
Іман Мохамаді

2

Це чудово підходить для копіювання всього, крім модулів вузлів :) насолоджуйтесь і завдяки відповідям вище, які я щойно додав до цього. На мій погляд, Rsync краще, ніж CP, оскільки ви можете бачити панель прогресу, не вимагаючи цього.

   rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules



-2

використовувати параметр розширення оболонки з регулярним виразом

cp /<path>/[^not_to_copy_file]* .

Все буде скопійовано, крім файлу not_to_copy_file

- якщо з цим щось не так. будь ласка уточніть !


1
Ласкаво просимо до SO. На жаль, ваша відповідь не вірна. В дужці вираз ( [...]) містить набір символів, які відповідають, тоді як ведучий ^спричинить збіг доповнення перелічених символів. У наступному прикладі, ні файл буде в списку: touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*тому що всі імена файлів , що починаються з будь-яким з наступних символів будуть виключені: _cefilnopty.
rtx13
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.