web-dev-qa-db-ja.com

1つのコマンドで.shファイルでいっぱいのディレクトリを実行する

たくさんの.shファイルを含むディレクトリがあります。これらすべてを実行すると、ターミナルが開き、youtube-dlのダウンロードが開始されます。非常に多数あるため、それらをすべて個別に実行するのではなく、一度にすべてをアクティブにし、いくつかの異なる端末をすぐに開く方法を見つけたいと思っていました。私はプログラミングにまだ非常に慣れていないため、これを行う方法と、すべてを実行するスクリプトを作成できるかどうか、コマンドを使用できるかどうか、正確にはわかりません。

7
Bencc

Yaronがforループで suggested としてディレクトリ内のすべての.shファイルを実際に実行できますが、これは実際には非常に複雑なアプローチです。スクリプトの違いがダウンロードするRLだけである場合は、多くのスクリプトを作成しないでください。そして、それらのそれぞれに対してターミナルウィンドウを生成する理由はまったくありません!

代わりに、YouTube URLを1行に1つずつファイルに書き込みます。

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
terdon

ファイルは実行可能である必要があります。上記のスクリプトを実行する前に、.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
Yaron

プログラムがWebベースの場合、つまり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

一部のビデオサイトはあまり安定しておらず、ダウンロードを何度か再試行する必要があることを経験しました。 GNU Parallelはそれを行うことができます:

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

これにより、CPUコアごとに1つのジョブが実行され、ダウンロードが失敗した場合は50回試行されます。実行時間の中央値よりも10時間がかかるジョブを強制終了します(ダウンロードが停止している場合など)。また、my.logファイルに追加されるため、各ジョブのステータスを確認できます。

0
Ole Tange