위의 폴더 경로를 고려하여 특정 일수가 지난 파일을 삭제하는 스크립트를 작성하려고 합니다. 저는 단지 경로를 하드코딩하는 것보다 좀 더 고급 기술을 사용하려고 합니다(실제 사례에는 많은 폴더가 있습니다). 이것이 내가 지금까지 가지고 있는 것입니다:
#!/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"
)
확장은 다음 기간에 발생합니다.디에 들어 ...나는 이것이 타당한 지적이라고 생각한다.