Как сжимать и копировать файлы сохранить структуру каталогов?

Я бы пошел по адресу https://packages.debian.org/source/ / , где - это конкретный выпуск Debian, который меня интересовал, а - это имя пакета.

Например: https://packages.debian.org/source/stable/python-pip

Оттуда я прокрутил бы страницу вниз и загрузил сжатый tar архивы (исходный код и дополнения Debian к этому источнику).

Если бы я не знал имя пакета, только то, что он должен содержать исполняемый файл pip , я бы пошел на https://packages.debian.org/ и найдите «пакеты, содержащие файлы с таким именем» и введите bin / pip в поле поиска внизу страницы.

Также можно использовать URL в следующем формате для прямого доступа к результатам поиска:

https://packages.debian.org/search?mode=exactfilename&searchon=contents&keywords=bin/pip

1
22.12.2016, 19:05
2 ответа

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

найти 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 с >" /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.

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

2
27.01.2020, 23:25

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

1
27.01.2020, 23:25

Теги

Похожие вопросы