ファイルを再帰的に移動します。ただし、他のプロセスで開かれていない場合にのみ適用されます。

ファイルを再帰的に移動します。ただし、他のプロセスで開かれていない場合にのみ適用されます。

ファイル権限、所有者を変更してファイルが別のプロセスで開かれていない場合は、ファイルを移動するために以下のスクリプトテキストを変更したいと思います。

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 で終了する場合にのみ実行されるようにします。これはファイルが開いていることを意味します。-amvfuser

これは最も安全なコマンドであり、ファイル名に含めることができる任意の文字を処理できます。

ただし、このコマンドはディレクトリにファイルが多いと非常に遅くなる可能性があります。実際、これらの負担を軽減するために{} +オプション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をフィルタリングしfindfuserファイル名(出力PIDとファイル名)のみを取得し、最終的に実行中のOriginalコマンドfuserに一度にすべてパイピングします。テスト目的で確認するときに何が移動するかを確認するオプションを追加することをお勧めします。xargsmv-pxargs

その後、権限と所有者を変更したいと言ったことも確認しました。とは別にchownファイルが開いていない場合にのみファイルを移動してください。しかし、あらかじめディレクトリ全体にプラス記号が表示されていることを確認しました。chmod(ところで、chown 777777が実際にシステムのユーザー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特定の出力により複雑になります。私はあなたのファイル名に改行文字が含まれていないと仮定するのが合理的だと思います。それ以外の場合は、最初のより単純ですが遅いコマンドを使用することもできます。

おすすめ記事