Я хотел бы скопировать все файлы из каталога, кроме одного с именем 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
.