Скопіюйте певні файли та збережіть структуру підпапки


2

Я отримав папку з великою кількістю файлів з різними суфіксами в декількох підпапках.

Мій робочий процес автомата працює наступним чином:

  1. Запитайте про елементи пошуку
  2. Отримати вміст папки (позначено параметр підпапки)
  3. Елементи пошуку фільтрів (для конкретного суфікса файлу)
  4. Копіювати елементи пошуку

Це працює як чарівність. Але всі файли копіюються в ту ж саму кореневу папку. Мені потрібно зберегти структуру підкаталогу. Наприклад:

sourceFolder
    subfolderA
        fileA.jpg
        fileB.xls
        fileC.xls
    subfolderB
        fileC.jpg
        fileD.xls
        fileE.xls

Очікуваний результат (фільтр для файлового суфікса .xls):

destinationFolder
    subfolderA
        fileB.xls
        fileC.xls
    subfolderB
        fileD.xls
        fileE.xls

Поточний результат:

destinationFolder
    fileB.xls
    fileC.xls
    fileD.xls
    fileE.xls

Оновлення

Я розробник. Таким чином, буде також прийнято оболонку або AppleScript. :)

Відповіді:


1
rsync -avh --include='*/' --include='*.xls' --exclude='*' path/to/sourceFolder/ path/to/destinationFolder

Зверніть увагу на / наприкінці шляху джерела, це важливо . Це рішення додасть всі порожні каталоги, якщо ви не хочете їх, подивіться на опцію --prune-empty-dirs.

З розширенням фігурної дужки ви можете включити більше типів файлів одночасно, ніж мати

--include='*.xls' --include='*.pdf' --include='*.txt'

можна використовувати

--include='*.'{xls,pdf,txt}

великий. ty! Я випробую і повернуся до нього.
Tino Rüb

Ви можете додати всі потрібні параметри, важлива частина яких включає – виключає: включати всі каталоги (необхідні для рекурсивності) і всі .xls файли, потім виключити все інше. Якщо ви хочете більше речей, як --delete додайте їх до своєї команди.
Manuel

1

Я закінчую сценарієм оболонки, який працює за запитом:

$ find ./sourceFolder -name "*.xls*" -type f -print0 | xargs -0 -I '{}' /usr/bin/rsync -avR "{}" "./destinationFolder/"

rsync -avh --include='*/' --include='*.xls' --exclude='*' sourceFolder/ destinationFolder? З розширенням фігурної дужки можна фактично включити більше типів файлів --include='*.'{xls,pdf,txt}.
Manuel

@Manuel ty! Будь-які переваги / недоліки вашого рішення?
Tino Rüb

Щоб ви не з'єднувалися через труби, ви просто телефонуєте rsync один раз з відповідними прапорами.
Manuel

0

У сценарії оболонки ви можете використовувати mkbom, щоб створити файл специфікації (bill of materials), який містить список файлів, які потрібно скопіювати. Тоді ви можете скористатися командою ditto з опцією --bom для копіювання тільки файлів, перелічених у файлі BOM.


ty! Будь-які переваги / недоліки вашого рішення?
Tino Rüb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.