Intereting Posts
Проблемы с настройкой TigerVNC и межсетевого экрана Как я могу узнать, является ли относительная символьная ссылка внутренней для определенного поддерева или нет? Почему установка Debian с DVD загружает множество пакетов? Как я могу отправить различный звук в левый и правый громкоговорители? Firefox не может получить доступ к доменам, определенным в / etc / hosts, если Network Manager отключен от сети Linux Swap Space Как скопировать / выставить многострочное выражение, которое я ввел в приглашении ZSH? Поиск греческого из командной строки буферный кеш и свободная память Измерьте потребление сети на каждую программу и месяц Почему pam_exec.so работает с sudo, а не с su? Название терминала показывает sudo, но я хочу, чтобы команда sudo'ed Почему «набор» не работает для меня, а «объявляет»? Разный раздел после обновления OPENWRT SVN добавляет скрытые файлы и фиксирует их через скрипт bash

Как gzip и копировать файлы, сохраняя свою структуру каталогов?

Как я могу gzip и копировать файлы в другую папку, сохраняя свою структуру каталогов одной командой в Linux?

Например, у меня есть:

/dir1 /dir1/file1.fit /dir1/file2.fit /dir1/file3.fit /dir1/dir2/file1.fit /dir1/dir2/file2.fit /dir1/dir2/file3.fit 

После использования команды (скажем, я /dir1 в /another_dir ), я хочу получить:

 /another_dir/dir1 /another_dir/dir1/file1.fit.gz /another_dir/dir1/file2.fit.gz /another_dir/dir1/file3.fit.gz /another_dir/dir1/dir2/file1.fit.gz /another_dir/dir1/dir2/file2.fit.gz /another_dir/dir1/dir2/file3.fit.gz 

Здесь /another_dir на самом деле является другим жестким диском. Поскольку в этом целевом диске недостаточно места (это данные 2TB!), Пожалуйста, не предлагайте мне сначала копировать файлы, а затем gzip all (или наоборот). Аналогично, gz-файлы не должны оставаться в исходной папке после операции.

Предполагая, что вы находитесь в корневой папке, где все каталоги для сжатия (в вашем случае / ), вы можете использовать find вместе с командой xargs , например

find dir1/ -name "*.fit" -print0 | xargs -i% -r0 sh -c 'mkdir -vp "$(dirname "/another_dir/%")" && gzip -vc "%" | tee "/another_dir/%".gz > /dev/null && rm -v "%"'

Примечание. Вы также можете заменить | tee "/another_dir/%".gz > /dev/null | tee "/another_dir/%".gz > /dev/null с > "/another_dir/%".gz .

Это найдет все .fit файлы в dir1/ и передаст их команде xargs для синтаксического анализа, где % заменяется на каждый из ваших файлов.

Команда xargs будет:

  • создайте пустую папку ( mkdir ) с ее p arents ( -p ) в качестве заполнителя,
  • сжимать заданный файл ( % ) в стандартный вывод ( -c ) и перенаправлять сжатый вывод в tee ,
  • tee сохранит сжатый вход в файл .gz (так как tee по умолчанию печатает вход на экран терминала, отправка его в /dev/null приведет к его подавлению, но он сохранит содержимое в данном файле).

После успешного сжатия удалите оригинал ( rm ). Вы всегда можете удалить эту часть, чтобы удалить их вручную после проверки ваших сжатых файлов.

Важно, что вы находитесь в относительной папке с вашим dir1/ , поэтому все пути, возвращаемые find относятся к текущей папке, поэтому вам не нужно преобразовывать абсолютные пути в относительные (это все еще может быть выполнено с помощью realpath , например realpath --relative-to=$absolute $current , но он просто перекомплементирует приведенную выше команду).

В macOS для использования аргумента -r для xargs вам необходимо установить GNU xargs ( brew install xargs ) и вместо этого использовать команду gxargs . Аналогично на других системах BSD.

Связанный вопрос: gzip несколько файлов в разных каталогах и копирование в новый каталог .

Я не знаю одной команды для этого, но поверх ServerFault – пример простого скрипта, который реализует то же самое. Обратите внимание, что он не сохраняет права доступа к файлам или время доступа / модификации и может иметь проблемы, если имена файлов содержат пробелы или аналогичные.