Executando um diretório cheio de arquivos .sh com um comando

7

Eu tenho um diretório com muitos arquivos .sh nele, todos os quais, quando executados, abrem um terminal e iniciam um download do youtube-dl. Como há tantos, eu esperava encontrar uma maneira de ativá-los de uma só vez, abrindo vários terminais diferentes imediatamente, ao invés de executá-los todos separadamente. Eu ainda sou muito novo para programação, então eu não sei exatamente como fazer isso e se eu poderia ou não criar um script para executá-los todos, usar um comando, etc. Qualquer ajuda é apreciada, obrigado.

    
por Bencc 30.04.2017 / 15:02

4 respostas

10

Embora você possa executar todos os arquivos .sh em um diretório com um loop for como sugerido por Yaron, é realmente uma abordagem complexa demais. Não escreva muitos scripts se a única diferença entre eles é a RL que eles baixam! E não há absolutamente nenhuma razão para gerar uma janela de terminal para cada um deles também!

Em vez disso, escreva seus URLs do YouTube em um arquivo, um por linha:

http://youtube.com/foo
http://youtube.com/bar
http://youtube.com/baz

Então, para baixá-los, use ( file é o nome do arquivo com as URLs):

while read url; do
    youtube-dl "$url"
done < file

Isso fará o download de cada vídeo no arquivo, um após o outro. Se você quiser baixá-los todos ao mesmo tempo (não é uma boa idéia se você tiver muitos), você pode executar cada comando de download em segundo plano adicionando & :

while read url; do
    youtube-dl "$url" &
done < file
    
por terdon 30.04.2017 / 15:43
2
  

Note que os arquivos devem ser executáveis - você pode querer executar o   seguinte comando no diretório que contém os arquivos .sh antes   executando o script acima:

chmod +x *.sh

O script a seguir levará todos os arquivos para .sh e os executará.

#/bin/bash
for shfile in *.sh
do
    ./$shfile
done

Você pode copiar / colar as linhas acima (sem a primeira linha #/bin/bash ) no seu terminal, e ele fará o truque (obrigado @terdon pelo seu comentário).

Você pode salvar este script em outra pasta (por exemplo, /tmp/execute_all.sh e torná-lo executável usando:

chmod +x /tmp/execute_all.sh

Em seguida, vá para o diretório com os arquivos .sh e execute o script usando:

/tmp/execute_all.sh

O script tentará executar todos os arquivos que terminem com .sh

    
por Yaron 30.04.2017 / 15:15
0

Se o programa for baseado na web, ou seja, para linux, tente criar um arquivo php para processar o shell. e um arquivo de shell para lidar com o php ..

Por exemplo: o arquivo runAllShell.php pode conter um loop.:

<?php
// Developed by A T.
// Count the files
$directory = '/put/directory/path_here/';
$files = glob($directory . '*.*');

if ( $files !== false )
{
    $filecounter = count( $files );

}
else
{
    echo "No Files were found";
}
$fileCount = $filecounter;

// Start the index
$fileNumber = 1;
while($fileNumber <= fileCount){
shell_exec('$fileNumber . ".sh"');
// get some feedback
echo "The ".$fileNumber." file has been excecuted";
// increment file number
$fileNumber++;

}
?>

certifique-se de que todos os arquivos .sh no diretório estejam numericamente ordenados para que isso funcione, por exemplo: 1.sh 2.sh 3.sh e assim por diante.

    
por StarShows Studios 01.05.2017 / 05:38
0

Eu tenho visto que alguns sites de vídeo não são muito estáveis e que eu tenho que tentar novamente o download várias vezes. O GNU Parallel pode fazer isso:

cat urls.txt | parallel --retries 50 --timeout 1000% --joblog +my.log youtube-dl

Isso executará um trabalho por núcleo da CPU e tentará 50 vezes se o download falhar. Ele eliminará tarefas que demoram mais de 10 que o tempo médio de execução (por exemplo, se o download estiver parado). Ele também será anexado ao arquivo my.log para que você possa ver o status de cada trabalho.

    
por Ole Tange 01.05.2017 / 23:29