タイトル通りにやろうとしています。毎日映画のリストを循環させるサーバーがありますが、ストレージ容量が不足しています。最も古い.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)