GNU/Linux >> Linux の 問題 >  >> Linux

複数のファイルのダウンロードが完了するのを待ちますか?

次のスクリプトを使用して、フォルダにファイルがあるかどうか、ファイルが安定しているかどうかを確認します(これは受信している大きなビデオファイル用です)。

#!/bin/bash

cdate1=$(date +%Y%m%d-%T)
folder1="/path-to-folder"

cd $folder1

while file=$(ls "$folder1")
      [ -z "$file" ]
        do sleep 10
        done
            echo "There is a file in the folder at $cdate1"
            size1=$(stat -c '%s' "$file")
            echo "The size1 is $size1"
            sleep 30
            size2=$(stat -c '%s' "$file")
            echo "The size2 is $size2"
        if [ $size1 = $size2 ]
        then
            ls -l
            echo "Start converting"
        else 
            echo "Restart the script"
        fi

同じフォルダ内の複数のファイルをチェックし、それらすべてが安定して変換スクリプトを開始できるようにスクリプトを変更するにはどうすればよいですか?

承認された回答:

スクリプトには、次のような問題がいくつかあります。

folder1="path-to-folder"
cd $folder1
while file=$(ls "$folder1") ...

これは実際にcdpath-to-folderを実行します。 lsパスからフォルダへ; path-to-folderの場合 絶対です(例のように「/」で始まります)これは機能する可能性がありますが、相対パスを使用する場合は常に機能しません。
path-to-folder> どこでも引用符を使用する必要があるため、スペースが含まれています。 cd "$ folder1"

次に、 while file =$(ls ...)を実行します file のように、無限ループを実行します 常に何かに設定されます (ディレクトリの内容)。

適切な構文は、 for file in $(ls ...)です。 、スペースを含むファイル名があるとすぐに機能を停止します(ループは foo で実行されるため) およびbar foo barという名前のファイルがある場合 )。 lsの出力を解析してはいけない理由を確認してください。 lsを使用する代わりに *のファイルに対してを実行するだけです。 。

最後に、サイズが変更されていなくても、ファイルが変更されている可能性があります。

ファイルを反復処理する良い方法は、 findです。 指図;何かが変更されたかどうかを確認する良い方法は、 mtimeです。 ファイルの。

次の関数は、指定されたディレクトリ内の任意のファイルの最終変更(mtime)の値を提供します

folder1="/path-to-folder"
find "${folder1}" -exec stat -c "%Y" \{\} \;    \
   | sort -n | tail -1

したがって、スクリプトは次のようになります。

#!/bin/bash
dir="$1"
# check whether $dir exists
test -d "${dir}" || exit 1

last=0
current=1

while [ "$last" != "$current" ]; do
   last=$current
   current=$(find "${dir}" -exec stat -c "%Y" \{\} \; \
             | sort -n | tail -1)
   sleep 10
done
echo "directory is now stable..."

更新

さらに良いアプローチは、特定のファイルが送信されたことを受信者に積極的に通知することです。
非常に簡単な解決策は、ペイロードが送信された後に空のダミーファイルもコピーすることです。例えば foo.aviという名前のファイルの場合 別のファイルをコピーするfoo.avi.copyfinished;したがって、 foo.avi.copyfinishedの存在を確認するだけで済みます。 そのfoo.aviを確認するには 準備ができています。

while true; do
 for file_ready in *.copyfinished; do
   file=${file_ready%.copyfinished}
   if [ -e "${file}.converted" ]; then
      echo "skipping already converted file ${file}" 1>&2
   else
      touch "${file}.converted"
      do_convert "${file}"
   fi
 done
 sleep 1
done

このソリューションには、明らかに送信側の協力が必要です。

関連:arduino –単一のUSBasp /SPIバスとArduinoIDEを使用して複数のICをプログラミングしますか?
Linux
  1. 行に基づいて単一のファイルを複数のファイルに分割する方法

  2. 最も古いファイルを移動するためのシェルスクリプト?

  3. Linux:複数のファイルのファイル拡張子を削除する

  1. Linux 用の優れた 16 進エディタが必要

  2. Linux で複数のファイル内の文字列を検索する

  3. Linuxでのファイルタグ付けの良い解決策は何ですか?

  1. メディアファイルスペースを節約するための7つのLinuxコマンドラインのヒント

  2. 1つのファイルを除くすべてのファイル/ディレクトリを削除しますか?

  3. Linux 上の大きなファイルのバイナリ diff/パッチ?