Топік написаний у відповідь на схожий.
Але головна проблема цього підходу в іншому - він не відповідає ідеології unix: складні завдання вирішуються комбінацією простих утиліт.
А тепер про те, як потрібно робити.
0. Декомпозиція
1. Отримання списку файлів
Зазвичай ми переглядаємо список файлів програмою ls. Її висновок виглядає приблизно так:
Чи підходить там такий висновок? Ні, тому, що в ньому недостатньо інформації - нам потрібно копіювати файли рекурсивно, значить для нас було-б набагато зручніше якщо перша в нашому ланцюжку програма видала там імена файлів разом з шляхами.
Наступна програма, яка приходить на розум - find
Вже краще але в висновок потрапили і директорії, а вони нам не потрібні. Спробуємо так:
Ось те, що там потрібно. Список файлів.
2. Фільтрація
Цей список файлів потрібно відфільтрувати. Переспрямуємо висновок нашої попередньої комманди в програму grep.
Добре, але в умовах завдання варто виключати файли, так що трохи поменеяем наш конвеєр
Перші дві частини виконані.
З man-сторінки для команди cp ми можемо дізнатися, що вихідний файл потрібно передавати програмі cp як аргумент, а ми поки можемо тільки перенаправити список на стандартне введення.
Застосуємо утиліту xargs - вона приймає стандартний ввід і викликає зазначену програму з параметрами зі стандартного вводу. Отже:
-n 1 означає, що тільки один рядок зі стандартного вводу підставляється в комманду, а -I% - визначає символ, який буде замінений в цільової комманде на сходинку зі стандартного вводу. У нашому випадку це буде
замість висновку
Я сподіваюся що це опис допоможе правильно підходити до вирішення як таких простих так і більш комплексних завдань.
Хочеться відзначити, що
- Цей спосіб далеко не Едіственний і навіть не найкоротший, а найбільш наочний для демонстрації методології рішення.
- Особисто я скористався-б tar --exclude = 2 -cf - ./ | (Cd / path / to / dest / tar -xvf -)
- Оскільки це перший мій топік, буду радий конструктивній критиці