ファイル権限、所有者を変更してファイルが別のプロセスで開かれていない場合は、ファイルを移動するために以下のスクリプトテキストを変更したいと思います。
cd /mnt/usbdrive/DVR
sudo chown 777 -R /mnt/usbdrive
sudo chmod 777 -R /mnt/usbdrive
find . -mindepth 2 -type f -name '*.ts' -exec mv -t /mnt/usbdrive {} +
答え1
あなたの場合、シンプルで効率的なfind
コマンドは次のとおりです。
find . -mindepth 2 -type f -name '*.ts' -exec fuser -s {} \; -a -exec mv /mnt/usbdrive {} \;
ここでは :note 演算子 ("and" を意味する)find
の表現力を活用して 0 で終了する場合にのみ実行されるようにします。これはファイルが開いていることを意味します。-a
mv
fuser
これは最も安全なコマンドであり、ファイル名に含めることができる任意の文字を処理できます。
ただし、このコマンドはディレクトリにファイルが多いと非常に遅くなる可能性があります。実際、これらの負担を軽減するために{} +
オプションmv
ラインに構文を使用しました。-t
残念ながら、-exec
この2つの操作にこの構文を使用することはできません。fuser
誰でも表示されたファイルが開いていて、どのファイルがfind
。
ここではまだ構文を使用できますが、{} +
より複雑なコマンドが必要です。このような:
find . -mindepth 2 -type f -name '*.ts' -exec fuser {} + 2>&1 | sed 's/^\(.\+\):.*/\1/' | xargs mv -t /mnt/usbdrive
使用されたものを分析すると、基本的にすべてのファイルが一度に考慮されますが、sedを介して出力-exec
をフィルタリングしfind
てfuser
ファイル名(出力PIDとファイル名)のみを取得し、最終的に実行中のOriginalコマンドfuser
に一度にすべてパイピングします。テスト目的で確認するときに何が移動するかを確認するオプションを追加することをお勧めします。xargs
mv
-p
xargs
その後、権限と所有者を変更したいと言ったことも確認しました。とは別にchown
ファイルが開いていない場合にのみファイルを移動してください。しかし、あらかじめディレクトリ全体にプラス記号が表示されていることを確認しました。chmod
(ところで、chown 777
777が実際にシステムのユーザーIDでない限り、そこにユーザー名を入力することはまったく意味がありません。しかし疑わしいです)。
つまり、xargs
これらのコマンドを複合コマンドとしてパッケージ化してシェルに追加できます。
このように:
find . -mindepth 2 -type f -name '*.ts' -exec fuser {} + 2>&1 | sed -e 's/^\(.\+\):.*/\1/' | xargs sh -c 'echo sudo chmod 777 "${@}"; echo sudo chown user "${@}"; echo mv -t /mnt/usbdrive "${@}"' --
実はこれだけプログラム実行するコマンドです。試してみて実際に適用する準備ができたら、sを削除してくださいecho
。
重要なヒント:find
の構文の使用を許可する後者の2つのコマンドは、{} +
改行文字を含むファイル名を処理sed
できませんが、fuser
特定の出力により複雑になります。私はあなたのファイル名に改行文字が含まれていないと仮定するのが合理的だと思います。それ以外の場合は、最初のより単純ですが遅いコマンドを使用することもできます。