Не существует такой волшебной опции, которая могла бы это сделать. Вы можете либо заранее сохранить открытый ключ вручную (, если он известен ), либо использовать какой-нибудь сценарий ожидания, который напишет вам «да» в случае, если отпечаток пальца «правильный».
Вы можете использовать эти сценарии awk для создания сценария оболочки. Просмотрите compress.sh, а затем запустите его:
ls *.pdf | awk 'BEGIN {ORS=""; print "#!/bin/sh"; } NR%1000 == 1 { print "\nzip Archive_" NR ".zip"; } { print " \\\n" $0; }' > compress.sh
#!/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
Альтернатива с 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
Ваши архивы будут красиво пронумерованы с ведущими нулями, а файлы в архивах также будут расположены в правильном порядке.
Эта версия не сломается, если в ваших именах файлов есть пробелы или символы новой строки.
Используя оболочку 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 файлами (или столько, сколько осталось, в конце ).