web-dev-qa-db-fra.com

Exécuter un répertoire plein de fichiers .sh avec une seule commande

J'ai un répertoire contenant de nombreux fichiers .sh qui, lorsqu'ils sont exécutés, ouvrent un terminal et commencent un téléchargement youtube-dl. Comme ils étaient si nombreux, j’espérais trouver un moyen de les activer tous en même temps, en ouvrant immédiatement plusieurs terminaux différents, au lieu de les exécuter séparément. Je suis encore très novice en programmation, je ne sais donc pas exactement comment faire cela et si je peux créer un script pour tous les exécuter, utiliser une commande, etc. Toute aide est la bienvenue, merci.

7
Bencc

Bien que vous puissiez en effet exécuter tous les fichiers .sh d'un répertoire avec une boucle for comme suggéré par Yaron, cette approche est vraiment complexe. N'écrivez pas beaucoup de scripts si la seule différence entre eux est le RL qu'ils vont télécharger! Et il n'y a absolument aucune raison de créer une fenêtre de terminal pour chacun d'eux non plus!

Écrivez plutôt vos URL YouTube dans un fichier, un par ligne:

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

Ensuite, pour les télécharger, utilisez (file est le nom du fichier avec les URL):

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

Cela téléchargera chaque vidéo dans le fichier, l’une après l’autre. Si vous voulez tous les télécharger en même temps (ce n’est pas une bonne idée si vous en avez trop), vous pouvez exécuter chaque commande de téléchargement en arrière-plan en ajoutant &:

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

Notez que les fichiers doivent être exécutables. Vous pouvez exécuter la commande suivante dans le répertoire contenant les fichiers _.sh_ avant d'exécuter le script ci-dessus:

_chmod +x *.sh
_

Le script suivant prendra tous les fichiers se terminant par _.sh_ et les exécutera.

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

Vous pouvez copier/coller les lignes ci-dessus (sans la première ligne _#/bin/bash_) dans votre terminal et cela fera l'affaire (merci à @terdon pour votre commentaire).

Vous pouvez enregistrer ce script dans un autre dossier (par exemple _/tmp/execute_all.sh_ et le rendre exécutable à l'aide de:

_chmod +x /tmp/execute_all.sh
_

Ensuite, allez dans le répertoire avec les fichiers _.sh_ et exécutez le script en utilisant:

_/tmp/execute_all.sh
_

Le script essaiera d’exécuter tous les fichiers qui se terminent par _.sh_

2
Yaron

Si le programme est basé sur le Web pour Linux, essayez de créer un fichier php pour traiter le shell. et un fichier shell pour gérer le php ..

Par exemple, le fichier runAllShell.php peut contenir une boucle.

<?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++;

}
?>

assurez-vous que tous les fichiers .sh du répertoire sont classés par ordre numérique pour que cela fonctionne, par exemple: 1.sh 2.sh 3.sh, etc.

0

J'ai constaté que certains sites vidéo n'étaient pas très stables et que je devais réessayer le téléchargement plusieurs fois. GNU Parallèle peut faire cela:

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

Cela exécutera un travail par cœur de processeur et tentera 50 fois si le téléchargement échoue. Cela supprimera les travaux qui prennent 10 fois plus longtemps que le temps d'exécution médian (par exemple, si le téléchargement est bloqué). Il sera également ajouté au fichier my.log afin que vous puissiez voir l'état de chaque travail.

0
Ole Tange