Окончательный ответ:
{ find <DIR> -type f -name "*.<EXT>" -printf "%s+"; echo 0; } | bc
и даже более быстрая версия, не ограниченная ОЗУ, но требующая GNU AWK с поддержкой bignum:
find <DIR> -type f -name "*.<EXT>" -printf "%s\n" | gawk -M '{t+=$1}END{print t}'
Эта версия имеет следующие особенности:
find
, чтобы указать файлы, которые вы ищете find
выполняет простое сопоставление имен файлов с использованием подстановочных знаков 5,5K
, 176,7M
, ...)
| numfmt --to = si
Можно стримить с youtube-dl и mpv.
Мой скрипт делает именно то, что вам нужно. Это очень просто...
Я думаю, что вам лучше всего с наименьшими усилиями использовать связанные с видео функции терминальной программы mps-youtube. Посмотрите здесь: https://github.com/mps-youtube/mps-youtube.
Например:
Если вы хотите посмотреть несколько видео, посвящённых Крису Корнеллу, и у вас установлен и запущен mps-youtube, вы можете использовать следующую команду, чтобы установить для воспроизведения видео значение «true» (в противном случае вы только получить аудио)
set show_video true
Затем найдите видео или плейлист, который вы хотите воспроизвести:
Для видео:
.Chris Cornell Tribute
Затем выберите видео, к которому вы хотите добавить похожие видео:
r 1
(где 1 – это видео, которое вы хотите видео для)
Затем просто введите диапазон видео, которые вы хотите воспроизвести.
1-50
(будут воспроизводиться все связанные видео, до номера 50.)
Вам также может понадобиться установить видеоплеер по умолчанию на mpv, так как я думаю, что программа по умолчанию использует mPlayer. Я понимаю, что это добавляет в микс совершенно отдельную программу, но она действительно использует технологию, о которой вы спрашиваете, оставляя вас в терминале.
можно использовать небольшой скрипт:
#!/usr/bin/perl
use strict;
use warnings;
my $id = $ARGV[0] or die "youtube ID as param needed";
$id =~ s/.*v=//;
my $yt = "https://www.youtube.com/watch?v=";
while(1){
`mpv $yt$id`;
($id) = `wget -q -O- "$yt$id"` =~ /"autoplay":\{.*?"videoId":"([^"]+)"/;
print "$id\n";
}
сохраните это как autoplay.pl
, вызовите chmod 755 autoplay.pl
, а затем попробуйте, например../autoplay.pl 5YTxsc3Cz24
или прямо в вашей оболочке:
perl -e 'my $id="5YTxsc3Cz24"; my $yt = "https://www.youtube.com/watch?v="; while(1){`mpv $yt$id`; ($id) = `wget -q -O- "$yt$id"` =~ /"autoplay":\{.*?"videoId":"([^"]+)"/; print "$id\n";}'
вы можете закончить воспроизведение, нажав ctrl+c (два раза, один раз для mpv, один для сценария ).
Приведенный выше код является базовым примером и не позволяет избежать циклов. если вы хотите избежать повторного воспроизведения видео с одним и тем же идентификатором, этого можно добиться, добавив ведро:
#!/usr/bin/perl
use strict;
use warnings;
my $id = $ARGV[0] or die "youtube ID or youtube url as param needed";
$id =~ s/.*v=//;
my $yt = "https://www.youtube.com/watch?v=";
my %bucket = ($id => 1);
while(defined $id){
print "$id\n";
`mpv $yt$id`;
my @ids = `wget -q -O- "$yt$id"` =~ /"videoId":"([^"]+)"/g;
undef $id;
for my $i(@ids){
unless($bucket{$i}){
$id = $i;
++$bucket{$id};
}
}
}
Этот код ищет на текущей странице YouTube все идентификаторы и пропускает уже воспроизведенные идентификаторы. он завершается, если на текущей странице не найден невоспроизведенный ID.
однако в некоторых редких (? )случаев, когда вы, возможно, уже воспроизвели все идентификаторы текущей страницы YouTube. затем скрипт должен искать страницы уже просмотренных идентификаторов:
#!/usr/bin/perl
use strict;
use warnings;
my $id = $ARGV[0] or die "youtube ID or youtube url as param needed";
$id =~ s/.*v=//;
my $yt = "https://www.youtube.com/watch?v=";
my %bucket = ($id => 1);
sub get_new_videoID{
my $id = shift;
my @ids = `wget -q -O- "$yt$id"` =~ /"videoId":"([^"]+)"/g;
my $new_id;
for my $i(@ids){
unless($bucket{$i}){
++$bucket{$i};
$new_id = $i;
last;
}
}
return $new_id;
}
sub search_seen_videos{
my @seen_IDs = keys %bucket;
my $new_id;
for my $id(@seen_IDs){
$new_id = get_new_videoID($id);
last if defined $new_id;
}
return $new_id;
}
while(defined $id){
print "$id\n";
`mpv $yt$id`;
$id = get_new_videoID($id) // search_seen_videos();
}
print "you have watched all related videos. better do something else now.\n";