Я хотел бы скопировать все файлы из каталога, кроме одного с именем Default.png. Кажется, есть несколько способов сделать это. Что кажется вам наиболее эффективным?
Я хотел бы скопировать все файлы из каталога, кроме одного с именем Default.png. Кажется, есть несколько способов сделать это. Что кажется вам наиболее эффективным?
Ответы:
Просто, если 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/ {} +
\;выполняет команду один раз для каждого файла. +выполняет команду один раз и сразу передает ей все имена файлов (в соответствии с ограничением длины командной строки). +в целом немного более эффективен.
Должно быть следующее:
cp -r !(Default.png) /dest
При копировании в папку, вложенную в текущую папку (в приведенном ниже примере это называется примером), вам также необходимо пропустить этот каталог:
cp -r !(Default.png|example) /example
shopt -s extglobдля работы, если она была отключена.
shopt -s extglobкак описано @BarryKelly. С этим все работает отлично.
!()... Красиво! Для тех, кто - как и я - считает, что пришло время изучить / просмотреть bash , вот соответствующие ссылки, связанные с этим вопросом / ответом: shopt / extglob и шаблон .
rsync долгое время был моей заменой cp / scp:
rsync -av from/ to/ --exclude=Default.png
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose increase verbosity
-rаргумент, если вы синхронизируете каталоги
Я бы просто сделал:
cp srcdir/* destdir/ ; rm destdir/Default.png
если файлы не большие. В противном случае используйте, например,
find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/
Default.pngсуществует в двух каталогах, он заменит один в destdirдругом srcdir, а затем удалит скопированный Default.png. Вместо этого OP хочет сохранить то, Default.pngчто уже существует в destdir.
Это отлично подходит для копирования всего, кроме узловых модулей :) наслаждайтесь, и благодаря приведенным выше ответам я только что добавил к нему. На мой взгляд, Rsync лучше, чем CP, так как вы можете видеть индикатор выполнения, даже не спрашивая об этом.
rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules
cp `ls | grep -v Default.png` destdir
# chattr +i /files_to_exclude
# cp source destination
# chattr -i /files_to_exclude
используйте параметр расширения оболочки с регулярным выражением
cp /<path>/[^not_to_copy_file]* .
Будет скопировано все, кроме not_to_copy_file
- если с этим что-то не так. пожалуйста уточни !
[...]) содержит набор символов для сопоставления, в то время как начало ^приведет к совпадению дополнения перечисленных символов. В следующем примере, ни файл будет в списке: touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*потому что все имена файлов , начинающиеся с любым из следующих символов будут исключены: _cefilnopty.