목록에서 빈 디렉터리를 감지하고 제거합니다.

목록에서 빈 디렉터리를 감지하고 제거합니다.

Unity3D 엔진과 Git을 사용할 때 게임 개발자가 직면하는 일반적인 문제는 Unity와 Git이 빈 디렉토리가 존재해야 하는지 논쟁한다는 것입니다. Git은 신경 쓰지 않고 Unity3D는 빈 디렉토리에 대해 git 추적 가능한 *.meta 파일을 계속 만듭니다. 기본적으로 커밋이 파일과 디렉터리를 제거하는 경우 개발자가 디렉터리와 메타파일을 수동으로 찾아 제거해야 함을 의미합니다.

Git이 파일을 삭제할 때 디렉터리 삭제를 트리거하는 Git 체크아웃 후 후크를 만들고 싶습니다.

저는 좋은 출발을 했습니다. Git이 무엇을 해야 하는지 알고 있습니다. 하지만 저는 쉘 스크립팅에 능숙하지 않으며 효율적이고 정확하게 작동하도록 하기 위해 고군분투하고 있습니다.

내가 겪고 있는 가장 큰 문제는 이 줄을 올바르게 이해할 수 없다는 것입니다.

dirs_to_check="($changed_files | xargs dirname | xargs sort -u)"

각 줄을 디렉터리 이름으로 파이프한 다음 전체 목록을 가져와 중복 항목을 제거하고 싶습니다.

#!/bin/sh
# This script will be run by Git after a checkout.

# --- Command line
oldRev="$1"
newRev="$2"
isBranchCheckout="$3"

# Grab a list of deleted files:
changed_files="$(git diff-tree -r --name-only --diff-filter=D --no-commit-id $oldRev $newRev)"
# Just testing:
##changed_files="$(git diff-tree -r --name-only --no-commit-id f5865290 eb793b0c)"

# Early exit if there are no removed files at all:
if [ -z "$changed_files" ]; then
    echo "No empty dirs"
    exit 0
fi

echo "$changed_files"
# Get the list of dir paths and then sort and remove dupes: 
dirs_to_check="($changed_files | xargs dirname | xargs sort -u)"

# For each dir check if its empty and if so, remove it:
# TODO: What about the case where the parent dir is also empty of files?
for dir in $dirs_to_check; do
    if [ "$(ls -A $dir)" ]; then
        echo "$dir Not Empty"
    else
        echo "$dir Empty"
        rm $dir
    fi
done

여기 몇 가지 예가 있어요변경된 파일보다 쉽게 ​​테스트하려면 다음 텍스트를 입력하세요.

test/with dir spaces/debrief/css/style.css
WFTO/uiresources/wftoUI/debrief/debrief.html
WFTO/uiresources/wftoUI/debrief/debrief_specification.js
WFTO/uiresources/wftoUI/debrief/js/debrief.js
WFTO/uiresources/wftoUI/debrief/js/debrief_specification.js
WFTO/uiresources/wftoUI/loading/Loading.css
WFTO/uiresources/wftoUI/loading/Loading.html
WFTO/uiresources/wftoUI/loading/LoadingDLC1.html
WFTO/uiresources/wftoUI/loading/images/HoG-logo.png
WFTO/uiresources/wftoUI/loading/images/background_unused.jpg
WFTO/uiresources/wftoUI/loading/images/banner-patch-1_4.png
WFTO/uiresources/wftoUI/loading/images/bg-back.jpg
WFTO/uiresources/wftoUI/loading/images/bg-front_unused.jpg
WFTO/uiresources/wftoUI/loading/images/bg-front_unused.png
WFTO/uiresources/wftoUI/loading/images/bg-logo.png
WFTO/uiresources/wftoUI/loading/images/dlc1/bg-back.jpg
WFTO/uiresources/wftoUI/loading/images/dlc1/bg-logo.png
WFTO/uiresources/wftoUI/loading/images/dlc1/load-bar-empty.png
WFTO/uiresources/wftoUI/loading/images/dlc1/load-bar-full.png
WFTO/uiresources/wftoUI/loading/images/load-bar-empty.png
WFTO/uiresources/wftoUI/loading/images/load-bar-full.png
WFTO/uiresources/wftoUI/loading/images/loading-background.png
WFTO/uiresources/wftoUI/loading/images/loading-background_unused.jpg
WFTO/uiresources/wftoUI/loading/images/random_loading_pics/Ld0.png
WFTO/uiresources/wftoUI/loading/images/random_loading_pics/Ld1.png
WFTO/uiresources/wftoUI/loading/images/random_loading_pics/Ld10.png

답변1

아마 당신 말은

dirs_to_check="$(echo "$changed_files" | xargs dirname | sort -u)"

수천 개의 디렉터리가 없으면 간단한 해결책은 rmdir각 디렉터리를 시도하고 오류를 무시하는 것입니다.

find . -depth -type d -exec echo rmdir --ignore-fail-on-non-empty {} + 

.해당 디렉토리의 최상위로 변경합니다 . rmdir에 무시 옵션이 없으면 2>/dev/null경고를 표시하지 않고 리디렉션하면 됩니다.

답변2

find "$DIR_TO_CLEAN" -type d -empty -delete -print

-print를 제거하면 삭제된 디렉터리 목록을 가져오지 않을 수 있습니다.

편집: "$DIR_TO_CLEAN" 디렉터리 자체를 삭제하지 않으려면 -minlength를 추가하세요.

find "$DIR_TO_CLEAN" -mindepth 1 -type d -empty -delete -print

관련 정보