Запуск каталога, полного файлов .sh с помощью одной команды

7

У меня есть каталог с большим количеством файлов .sh в нем, все из которых при запуске открывают терминал и запускают загрузку youtube-dl. Поскольку их так много, я надеялся найти способ активировать их все сразу, открыв сразу несколько разных терминалов, а не выполнять их отдельно. Я все еще очень новичок в программировании, поэтому я не совсем уверен, как это сделать, и могу ли я создать скрипт для запуска их всех, использования команды и т. Д. Любая помощь приветствуется, спасибо.

    
задан Bencc 30.04.2017 в 13:02
источник

4 ответа

9

Хотя вы действительно можете запустить все .sh файлов в каталоге с циклом for, поскольку предлагаемый Яроном, это это действительно сложный подход. Не пишите много скриптов, если только разница между ними - это RL, который они будут загружать! И нет абсолютно никакой причины создавать окно терминала для каждого из них!

Вместо этого напишите URL-адреса YouTube в файл, по одному в строке:

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

Затем, чтобы загрузить их, используйте ( file - это имя файла с URL-адресами):

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

Это будет загружать каждое видео в файл один за другим. Если вы хотите загрузить их все одновременно (не очень хорошая идея, если у вас их слишком много), вы можете запустить каждую команду загрузки в фоновом режиме, добавив & :

while read url; do
    youtube-dl "$url" &
done < file
    
ответ дан terdon 30.04.2017 в 13:43
источник
2
  

Обратите внимание: файлы должны быть исполняемыми - вы можете выполнить   следующая команда в каталоге, в котором хранятся файлы .sh   запуск приведенного выше сценария:

chmod +x *.sh

Следующий скрипт будет считать, что все файлы заканчиваются .sh и будут выполнять их.

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

Вы можете скопировать / вставить вышеуказанные строки (без первой строки #/bin/bash ) в свой терминал, и он выполнит трюк (спасибо @terdon за ваш комментарий).

Вы можете сохранить этот скрипт в другой папке (например, /tmp/execute_all.sh и сделать его выполнимым с помощью:

chmod +x /tmp/execute_all.sh

Затем перейдите в каталог с файлами .sh и выполните сценарий, используя:

/tmp/execute_all.sh

Сценарий попытается выполнить все файлы, которые заканчиваются на .sh

    
ответ дан Yaron 30.04.2017 в 13:15
0

Если программа работает в сети, то есть для Linux, попробуйте сделать php-файл для обработки оболочки. и файл оболочки для обработки php ..

Например: файл runAllShell.php может содержать цикл.:

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

}
?>

убедитесь, что все .sh-файлы в каталоге численно упорядочены для этого: i.e: 1.sh 2.sh 3.sh и т. д.

    
ответ дан StarShows Studios 01.05.2017 в 03:38
0

Я испытал, что некоторые видеосайты не очень стабильны, и мне приходится несколько раз повторять загрузку. GNU Parallel может это сделать:

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

Это запустит одно задание на ядро ​​процессора и попробует 50 раз, если загрузка завершится неудачно. Он будет убивать задания, которые занимают 10 дольше, чем среднее время выполнения (например, если загрузка застряла). Он также добавит файл my.log , чтобы вы могли видеть статус каждого задания.

    
ответ дан Ole Tange 01.05.2017 в 21:29