リストから空のディレクトリを検出して削除します。

リストから空のディレクトリを検出して削除します。

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

関連情報