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

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

タイトル通りにやろうとしています。毎日映画のリストを循環させるサーバーがありますが、ストレージ容量が不足しています。最も古い.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から文字をエスケープする場合は、対話型シェルで機能する必要があります。*[^\!]*


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

答え2

まず、見つからない結果を検索して削除する方法なので、あなたのアプローチは非常に危険だと思います。最も古いファイルを確認して削除するスクリプトにこの確認を添付すると、はるかにmp4安全で有益になります。

それにもかかわらず、ここにあなたのニーズに合ったスクリプトがあります。ロギングとデバッグの目的で複数行が含まれているため、各フォルダはスキャン先、タイミング、分類方法を確認できます。冗長性を減らすには、後で削除してください。

#!/bin/bash
# TO USE NAME IT script_check_dirs.sh and place it in the top directory
# RUN SOMETHING ALONG THE LINES OF:
#find . -mindepth 1 -type d -exec ./script_check_dirs.sh {} \;


bn=$(basename $1);     #FOLDER NAME VARIABLE
echo $bn >> dir_list;  #LOG FILE LISTING ALL FOLDERS

if [[ $bn == *\!* ]] ;   #FIRST CHECK FOR SYMBOL IN FOLDER NAME
  then
  echo -e "\n DIRECTORY:$bn -" DONT CHECK directory "$bn" ;
  echo $bn >> dir_list_good ; #APPEND TO LOG FILE LISTING FOLDERS TO KEEP
else 
  echo -e "\n DIRECTORY:$bn  -- CHECKING DIRECTORY $bn because it does not have ! in its name "; 
  f_v=$(find $bn -type f | grep -i "mp4" ); 
    if [[ $? -eq 0 ]] ; 
    then 
    echo -e "\t" FOUND MP4 FILES in $bn; 
    echo -e "\t\t" $f_v ; 
    echo -e "\t" NO - DONT DELETE $bn ; 
    echo $bn >> dir_list_good;    #APPEND TO LOG FILE LISTING FOLDERS TO KEEP
   else 
   echo -e "\t YES -- DIRECTORY $bn CAN BE DELETED because there were no mp4 files found and directory name $bn has no ! " ;
   echo $bn >> dir_list_del;  #APPEND TO LOG FILE LISTING FOLDERS TO DELETE
  fi ;
fi

その後、生成された3つのリストを確認するか、リスト全体とdir_*削除する必要があるリストのみを確認できる場合は、次の内容が表示されます。

$ paste dir_list dir_list_del > list_formatted
$ awk ' BEGIN{printf "%-25s | %s\n","ALL","DELETE"; s=sprintf("%70s","");gsub(/ /,"-",s);print s}{printf "% -25s| %-s\n",$1,$2}' < list_formatted
ALL                      | DELETE
------------------------------------------------------------------------
!node_test3              | node_test2
node_test2               | node_test4
node_test4               | 
node_test1               | 
!node_test0              | 

答え3

名前に通常のファイルがzsh含まれていないか!含まれていないディレクトリを探します。.mp4

set -o extendedglob
typeset -Ua dirs=(^*!*(N/^e['()(($#)) $REPLY/*.mp4(N.Y1)']))

最も古いmp4ファイルを含むディレクトリを削除します!(名前に含まれているディレクトリを除く)。

set -o extendedglob
rm -rf -- ^*!*/*.mp4(.om[1]:h)

関連情報