고쳐 쓰다

고쳐 쓰다

여기에 이미지 설명을 입력하세요.

위의 폴더 경로를 고려하여 특정 일수가 지난 파일을 삭제하는 스크립트를 작성하려고 합니다. 저는 단지 경로를 하드코딩하는 것보다 좀 더 고급 기술을 사용하려고 합니다(실제 사례에는 많은 폴더가 있습니다). 이것이 내가 지금까지 가지고 있는 것입니다:

#!/bin/bash

FILEAGE=15

#Array of folders to clean
dir_array=(
"/srv/*/folderA"
"/srv/level1D/*/folderA"
)


#function to be used for deleting files.  Needs to be called with a path
function dir_delete() {
    echo "Deleting:"
    find $1 -type f -mindepth 1 -maxdepth 1 -mtime +$FILEAGE -delete -print
    echo ""
}

echo "##### Looping through dir_array array and using dir_delete function to delete files older than $FILEAGE days #####"
for d in "${dir_array[@]}";do
    if [ -d $d ];then
                
        echo "##### Deleting all files older than $FILEAGE in $d #####"
        dir_delete $d
        
    else
        echo "##### Did not find directory: \$d #####"
        echo ""
    fi
    
done

내 스크립트는 다음과 같은 디렉터리를 찾을 수 없다고 반환합니다.

Did not find directory: /srv/*/folderA

참고: 이 폴더에는 15일 동안 삭제할 수 없는 파일이 포함되어 있습니다.

고쳐 쓰다

@Kusalananda의 제안을 사용하면 '/srv/'*'/folderA'문제가 해결되었습니다. 내가 뭘 잘못하고 있는지 알고 싶은 사람이 있다면 위의 원본 게시물에 잘못된 코드를 남겨 두었습니다.

답변1

쉘 글로빙 패턴은 *큰따옴표 내에서 확장되지 않습니다. 이것은 루프를 의미합니다

for d in "${dir_array[@]}";do

루핑무늬. 을 호출할 때 dir_delete따옴표가 없는 패턴을 사용하므로 거기에서 확장됩니다(그러나 결코 거기에 도달하지 않습니다). 그러나 이 함수는 첫 번째만 사용합니다.단어통화 패턴과 일치하는 모든 것 find.

정말 놀라운 점은 이러한 패턴이 테스트에서도 확장된다는 점입니다 . 테스트에서는 테스트에만 필요한 사항만 필요 [ -d $d ]하기 때문에 어색합니다.-d하나의경로명. 이것이 스크립트가 궁극적으로 실패하는 이유입니다.

대신 다음에 할당할 때 스키마를 올바르게 확장했는지 확인하세요 dir_array.

dir_array=(
    /srv/*/folderA
    /srv/level1D/*/folderA
)

경로 이름의 다른 부분에 공백 등이 포함된 경우 folderA경로 이름의 해당 부분을 인용해야 하지만 *인용해서는 안 됩니다.

또한 인용할 필요가 없는 상황을 알지 않는 한 모든 변수의 확장을 큰따옴표로 묶어야 합니다.

다음 줄에 인용 문제가 있을 수 있습니다.

  • if [ -d $d ];then
  • find $1 -type f -mindepth 1 -maxdepth 1 -mtime +$FILEAGE -delete -print
  • dir_delete $d

또한 가변 데이터를 출력할 때 printf대신 사용하는 것도 고려해 보십시오.echo

관련된:

답변2

*()를 사용하여 변수 내에서 와일드카드를 확장할 수 있는 확장된 glob 옵션을 사용하여 이 작업을 수행할 수 있습니다.

shopt -s extglob
dir_array=(
    "/srv/*(*)/folderA"
    "/srv/level1D/*(*)/folderA"
)

확장은 다음 기간에 발생합니다.디에 들어 ...나는 이것이 타당한 지적이라고 생각한다.

관련 정보