итеративное сжатие файлов

Не существует такой волшебной опции, которая могла бы это сделать. Вы можете либо заранее сохранить открытый ключ вручную (, если он известен ), либо использовать какой-нибудь сценарий ожидания, который напишет вам «да» в случае, если отпечаток пальца «правильный».

1
13.09.2019, 12:30
4 ответа

Вы можете использовать эти сценарии awk для создания сценария оболочки. Просмотрите compress.sh, а затем запустите его:

ls *.pdf | awk 'BEGIN {ORS=""; print "#!/bin/sh"; } NR%1000 == 1 {  print "\nzip Archive_" NR ".zip"; } { print " \\\n" $0; }' > compress.sh
0
27.01.2020, 23:40
#!/usr/bin/perl

use strict;
use List::MoreUtils qw(natatime);
use Sort::Naturally;

# specify directory on command line, or default to.
my $dir = shift || '.';

# Find all the PDF files. 
#
# NOTE: you could use perl's `Find::File` module instead of
# readdir() to do a recursive search like `find`.
opendir(DIR, $dir) || die "Can't open $dir: $!\n";
my @pdfs = nsort grep { /\.pdf$/i && -f "$dir/$_" } readdir(DIR);
closedir(DIR);

my $size=1000;

my $i=1;
my $iter = natatime $size, @pdfs;
while( my @tmp = $iter->() ){
  my $tarfile="archive_". sprintf('%02i',$i++). ".tar.gz";
  #print join(" ", ('tar','cfz',$tarfile, @tmp)),"\n";
  system('echo','tar','cfz',$tarfile, @tmp);
}

Здесь используется функцияnatatime()("n -at -a -time" )в модуле библиотеки Perl List::MoreUtilsдля перебора списка файлов PDF по 1000 за раз.

Он также использует модуль Sort::Naturallyдля естественной -сортировки имен PDF-файлов. Отбросьте это (и вызов nsortна линии my @pdfs =...), если вам это не нужно или не нужно.

Имена файлов tar содержат 2 -нулевых -цифр, дополненных числами, чтобы они правильно сортировались. Измените его на 3 или более цифр, если у вас достаточно файлов PDF для заполнения более 99 tar-архивов.

Код, как написано, является сухим -прогоном . Удалите 'echo',из вызова функции system(), чтобы он действительно архивировал пакеты PDF-файлов.

Для подробного вывода при работе без echoраскомментируйте оператор print. Кстати, было бы легко заставить его печатать метку времени, например. секунд с тех пор, как Perl построил -в time()или красиво отформатировал с помощью модуля Date::Format. например:

print join(" ", (time(),'tar','cfz',$tarfile, @tmp)),"\n";

Сохранить как, например, vibhu.pl, сделать его исполняемым с помощью chmod +x vibhu.pl. Вот пример запуска (в каталоге только с 10 файлами ".pdf"):

$ touch {1..10}.pdf
$./vibhu.pl 
tar cfz archive_01.tar.gz 1.pdf 2.pdf 3.pdf 4.pdf 5.pdf 6.pdf 7.pdf 8.pdf 9.pdf 10.pdf

Если вы измените $size=1000, например, на $size=3, вы увидите, что на самом деле выполняется N pdf-файлов за раз:

$./vibhu.pl 
tar cfz archive_01.tar.gz 1.pdf 2.pdf 3.pdf
tar cfz archive_02.tar.gz 4.pdf 5.pdf 6.pdf
tar cfz archive_03.tar.gz 7.pdf 8.pdf 9.pdf
tar cfz archive_04.tar.gz 10.pdf

Модули List ::MoreUtils и Sort ::Naturally доступны на CPAN . Возможно, они уже упакованы для вашего дистрибутива. например. на Debian:

sudo apt-get install liblist-moreutils-perl libsort-naturally-perl
1
27.01.2020, 23:40

Альтернатива с find и xargs, потому что парсить не нужноls:

export numfile="$(mktemp)"
echo 0 > "$numfile"

find lots_of_files/ -name '*.pdf' -print0 \
| sort -V -z \
| xargs -0r -L 1000  \
bash -c 'NUM=$(cat "$numfile") ; ((NUM++)); echo "$NUM" > "$numfile"; \
  tar -czf archive_$(printf '%03d' "$NUM" ).tar.gz "$@"' tar_in_batches

rm "$numfile"
unset numfile

Ваши архивы будут красиво пронумерованы с ведущими нулями, а файлы в архивах также будут расположены в правильном порядке.

Эта версия не сломается, если в ваших именах файлов есть пробелы или символы новой строки.

0
27.01.2020, 23:40

Используя оболочку bash, вы можете поместить имена файлов в массив (, отсортировав их естественным образом с помощью подстановочного знака ), а затем разрезать по 1000 за раз в индексированном цикле:

#!/bin/bash

filenames=( *.pdf )
for((index=1; index <= $(( (${#filenames[@]} / 1000) + 1)); index++))
do
  start=$(( (index-1) * 1000 ))
  tar czf archive"${index}".tar "${filenames[@]:start:999}"
done

Цикл forвыполняется столько раз, сколько необходимо для получения 1000 файлов за одно прогон. Переменная startуказывает, где должен начинаться срез массива. Команда tarсоздает индексированный tar-файл из 1000 файлов в массиве, начиная с startи заканчивая следующими 999 файлами (или столько, сколько осталось, в конце ).

0
27.01.2020, 23:40

Теги

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