ファイルの種類と日付に基づいてディレクトリを検索して移動する

ファイルの種類と日付に基づいてディレクトリを検索して移動する

200を超えるサブディレクトリ「映画名(年)」を含む「New Movies」ディレクトリがあります。サブディレクトリ「映画名(年)」には、ビデオファイル(avi / mkv)と関連する複数のjpg / xmlファイルが含まれています。

少なくとも180日以上経過したビデオファイルを含むすべてのディレクトリを別のディレクトリに移動する必要があります。

たとえば、

新しい映画/映画A(年)には、movie.mkv、folder.jpg、およびmovie.xmlが含まれます。別の場所で同じ名前のサブディレクトリに移動し、すべてのファイルが存在し、そのまま残すようにします。

このサイトの他の場所を見て、次のことを試しました。

cd "/mnt/user/New Movies/"
find -type f \( -name "*.avi" -or -name ".*mkv" \) -mtime +180 -exec sh -c 'mv "${0%/*}" /mnt/user/Movies' {} \;

このコマンドは、最初のサブディレクトリとすべてのファイルを新しいディレクトリに正常に移動しましたが、それ以降のすべての操作はエラーを返します。

find: './Movie B (year)': No such file or directory
find: './Movie C (year)': No such file or directory

移動するかどうかにかかわらず、「新しい映画」の下に含まれるすべてのディレクトリに移動します。

ベストアンサー1

-exec mv現在確認しているディレクトリを確認しないでくださいfindfindこれは混乱しているようです。

回避策:まずディレクトリを見つけてから移動します。

cd "/mnt/user/New Movies/"
find -type f \( -name "*.avi" -or -name ".*mkv" \) -mtime +180 \
  -printf "%h\0" | xargs -0 mv -t /mnt/user/Movies

説明する:

  • -printfフォーマット文字列に従って一致を印刷します。
  • %h一致するパス部分を印刷します。これは"${0%/*}"あなたのコマンドに対応します。
  • \0項目を区切るにはnull文字を使用してください。これは、ファイル名に改行文字が含まれないようにするためです。
  • xargsパイプラインから入力を収集し、追加された入力パラメータを使用して実行します。
  • -0入力が改行区切りではなくヌル区切りとして予想されるように xargs に指示します。
  • mv -t <target>mv呼び出し時にすべてのソースパラメータを最後に追加できます。

まだ完全に安全ではありません。パイプバッファと組み合わせたいくつかの奇妙なスケジューラタイミングは、mvディレクトリから移動する前にまだ実行を引き起こす可能性があります。findこれを防ぐには、次のようにします。

cd "/mnt/user/New Movies/"
find -type f \( -name "*.avi" -or -name ".*mkv" \) -mtime +180 \
  -printf "%h\0" > dirstomove
xargs -0 mv -t /mnt/user/Movies < dirstomove

バックグラウンドノート:

あなたの状況は次のとおりですfind

  1. findディレクトリに移動します/mnt/user/New Movies/。そこからキャッシュに使用可能なディレクトリを書き込みます。
  2. findシステムコールを使用してサブディレクトリの1つに移動しますchdir(subdirname)
  3. findフィルタを通過した動画ファイルを探します。
  4. findmv指定されたパラメータを使用して実行されます。
  5. mvディレクトリをに移動します/mnt/user/Movies
  6. findシステムコールを使用して親ディレクトリに戻ると、コールchdir(..)/mnt/user/Movies代わりに次のようになります。/mnt/user/New Movies/
  7. find前述のディレクトリが見つからず、多くのエラーが発生するため、非常に混乱しています。

この仮定は、次の質問に対する回答に基づいています。find -exec mvが最初の実行後に停止しましたfindこの場合、なぜ動作が停止し、あなたの場合にエラーが発生するのかわかりません。他のバージョンがfind説明かもしれません。

おすすめ記事