ファイルを含むディレクトリを削除する(「!」で始まるディレクトリを除く)

ファイルを含むディレクトリを削除する(「!」で始まるディレクトリを除く)

タイトル通りにやろうとしています。毎日映画のリストを循環させるサーバーがありますが、ストレージ容量が不足しています。最も古い.mp4を処理して削除するスクリプトがあります。映画関連のファイルが残ってスペースだけを占めました。フォルダ全体を削除したいです。

現在これは私のコードです。

#Finds oldest *.mp4 and deletes it.
stat --printf='%Y %n\0' "$dir"/New_Movies/*/*.mp4 | sort -z  | sed -zn '1s/[^ ]\{1,\} //p' | xargs -0 rm

以下は、*.mp4や「!」が含まれていないディレクトリを見つけるために失敗した試みです。ディレクトリ名に。例名:「!アクション」。

for d  in "$dir"/New_Movies/*/; do 
 if ! [ -e "*!*" ]; then
      [ -f "$d"*.mp4 ] || printf '%s\n' "$d"
  fi
 done

テストすると、各実行ごとに1つずつ3つの異なる出力が得られます。

実行1:正しいディレクトリと「!」を含むすべてのディレクトリが提供されました。 (ショートカットなので空に見えると思います。)

実行2:上記と同じですが、各printfの間に「-bash:[:引数が多すぎます」がたくさんあります。

実行3:コードが壊れて実行されません。

以降:1〜3を順番に繰り返し実行します。

ディレクトリの例:

/新しい映画/

/New_Movies/*/index.php

/New_Movies/foo/foo.mp4、foo.jpg、foo.xml

/New_Movies/bar/bar.jpg, bar.xml

スクリプトを実行した後は、/New_Movies/foo とその内容が残っている必要があります。

ベストアンサー1

履歴拡張がデフォルトで無効になっているスクリプト内で、単純なシェルglobを使用して、名前に次のものが含まれていないディレクトリと一致する!必要があります。 (最初はPOSIX否定です。)!*[^!]**[!!]*!

「*.mp4を含まないディレクトリ」の状況をテストする方法はいくつかあります。お気に入りの方法は、setシェル組み込みの別のglobを使用して位置引数の数に関する結果をテストすることです$#

総合してみると:

#!/bin/bash

shopt -s nullglob

for d in ./*[^!]*/; do
  set -- "$d"/*.mp4
  if [ $# -eq 0 ]; then
    printf '%s\n' "$d"
  fi
done

!この方法は、履歴拡張を無効にするか、globから文字をエスケープする場合は、対話型シェルで機能する必要があります。*[^\!]*


注:タイトルは以下を参照してください。「!」で始まるディレクトリしかし、あなたが言及した本文には「!」を含むディレクトリ。私は後者が真であると仮定していますが、前者だけを除外するには、*グローバルから先行を削除します。

おすすめ記事