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.
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
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
_
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.
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.