파일이 포함된 디렉터리 삭제("!"로 시작하는 디렉터리 제외)

파일이 포함된 디렉터리 삭제("!"로 시작하는 디렉터리 제외)

제목대로 해보려고 합니다. 매일 영화 목록을 순환시키는 서버가 있는데 저장 공간이 부족합니다. 가장 오래된 .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나 "!"가 포함되지 않은 디렉토리를 찾으려는 실패한 시도입니다. 디렉토리 이름에. 예시 이름: "!Action".

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

테스트할 때 각 실행마다 하나씩 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

그런 다음 생성된 세 개의 목록을 확인하거나 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)

관련 정보