Я хотел бы скопировать все файлы из каталога, кроме одного с именем Default.png. Кажется, есть несколько способов сделать это. Что кажется вам наиболее эффективным?
Почему вам нужно пропустить этот файл, а не просто удалить его после копирования? Он уже существует в целевом каталоге?
Лассе В. Карлсен,
1
Да, файл с таким именем уже существует в целевом каталоге.
Джо Каннатти
@ LasseV.Karlsen: Или вы можете сэкономить время на его копирование, если это большой файл. Меня это интересует, но за исключением каталога, а не файла.
Nikana Reklawyks
Ответы:
55
Просто, если 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/{}+
Это оказалось для меня лучшим вариантом, потому что, похоже, OS X поставляется без включенного glob.
Джо Каннатти
6
@Max \;выполняет команду один раз для каждого файла. +выполняет команду один раз и сразу передает ей все имена файлов (в соответствии с ограничением длины командной строки). +в целом немного более эффективен.
Джон Кугельман
149
Должно быть следующее:
cp -r !(Default.png)/dest
При копировании в папку, вложенную в текущую папку (в приведенном ниже примере это называется примером), вам также необходимо пропустить этот каталог:
Вы копируете файлы в папку, вложенную в папку, из которой вы копируете?
Джон
47
Это необходимо shopt -s extglobдля работы, если она была отключена.
Барри Келли
5
Кажется, что OS X нужно использовать, shopt -s extglobкак описано @BarryKelly. С этим все работает отлично.
Кэт
Годы на Баше и не знали о !()... Красиво! Для тех, кто - как и я - считает, что пришло время изучить / просмотреть bash , вот соответствующие ссылки, связанные с этим вопросом / ответом: shopt / extglob и шаблон .
Первая команда - это не то, о чем просил OP. Если он Default.pngсуществует в двух каталогах, он заменит один в destdirдругом srcdir, а затем удалит скопированный Default.png. Вместо этого OP хочет сохранить то, Default.pngчто уже существует в destdir.
SnowFrog
2
как насчет того, что default.png уже существует в destdir? Ваше решение не сработает.
Иман Мохамади 03
2
Это отлично подходит для копирования всего, кроме узловых модулей :) наслаждайтесь, и благодаря приведенным выше ответам я только что добавил к нему. На мой взгляд, Rsync лучше, чем CP, так как вы можете видеть индикатор выполнения, даже не спрашивая об этом.
Добро пожаловать в SO. К сожалению, ваш ответ неверен. Выражение в квадратных скобках ( [...]) содержит набор символов для сопоставления, в то время как начало ^приведет к совпадению дополнения перечисленных символов. В следующем примере, ни файл будет в списке: touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*потому что все имена файлов , начинающиеся с любым из следующих символов будут исключены: _cefilnopty.
Ответы:
Просто, если
src/
содержит только файлы:Если
src/
есть подкаталоги, он их пропускает, но копирует файлы внутри них:Если
src/
есть подкаталоги, это не рекурсивно в них:источник
\;
выполняет команду один раз для каждого файла.+
выполняет команду один раз и сразу передает ей все имена файлов (в соответствии с ограничением длины командной строки).+
в целом немного более эффективен.Должно быть следующее:
При копировании в папку, вложенную в текущую папку (в приведенном ниже примере это называется примером), вам также необходимо пропустить этот каталог:
источник
shopt -s extglob
для работы, если она была отключена.shopt -s extglob
как описано @BarryKelly. С этим все работает отлично.!()
... Красиво! Для тех, кто - как и я - считает, что пришло время изучить / просмотреть bash , вот соответствующие ссылки, связанные с этим вопросом / ответом: shopt / extglob и шаблон .rsync долгое время был моей заменой cp / scp:
источник
-r
аргумент, если вы синхронизируете каталогиЯ бы просто сделал:
если файлы не большие. В противном случае используйте, например,
источник
Default.png
существует в двух каталогах, он заменит один вdestdir
другомsrcdir
, а затем удалит скопированныйDefault.png
. Вместо этого OP хочет сохранить то,Default.png
что уже существует вdestdir
.Это отлично подходит для копирования всего, кроме узловых модулей :) наслаждайтесь, и благодаря приведенным выше ответам я только что добавил к нему. На мой взгляд, Rsync лучше, чем CP, так как вы можете видеть индикатор выполнения, даже не спрашивая об этом.
источник
источник
источник
используйте параметр расширения оболочки с регулярным выражением
Будет скопировано все, кроме not_to_copy_file
- если с этим что-то не так. пожалуйста уточни !
источник
[...]
) содержит набор символов для сопоставления, в то время как начало^
приведет к совпадению дополнения перечисленных символов. В следующем примере, ни файл будет в списке:touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*
потому что все имена файлов , начинающиеся с любым из следующих символов будут исключены:_cefilnopty
.