Я хотів би скопіювати всі файли з режиму, крім одного з ім'ям 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. З цим воно прекрасно працює.
!()
... Красиво! Для тих, хто - як я - вважаю, що настав час вивчити / переглянути баш , ось відповідні посилання, пов'язані з цим питанням / відповіддю: 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
. Натомість ОП хоче зберегти те, 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
.