Detectar e remover diretórios vazios da lista

1

Um problema comum que os desenvolvedores de jogos têm com o mecanismo Unity3D e Git é que Unity e Git lutam para saber se um diretório vazio deve existir ou não - o Git não se importa, o Unity3D continuará fazendo arquivos * .meta para diretórios vazios . Basicamente significa que os desenvolvedores devem encontrar e excluir manualmente os diretórios e arquivos meta se uma confirmação for feita removendo arquivos e diretórios.

Gostaria de criar um gancho pós-check-out do Git para acionar uma remoção de diretório quando o Git excluir arquivos.

Eu fiz um bom começo - eu sei o que preciso que o Git faça. Mas eu não sou muito bom com scripts de shell e estou com dificuldades para fazer isso funcionar de forma eficiente e correta.

A principal questão que estou tendo é que eu simplesmente não consigo entender corretamente esta linha:

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

Eu esperava que fosse canalizar cada linha para o dirname, então pegue a lista completa e remova os dupes.

#!/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

Aqui está um exemplo de texto changed_files se você quiser testar mais facilmente:

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
    
por S.Richmond 22.04.2016 / 15:56

2 respostas

2

Você provavelmente quis dizer

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

Uma solução simples, a menos que você tenha milhares de diretórios, é simplesmente tentar rmdir de cada diretório e ignorar os erros.

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

Altere . para o topo dos diretórios em questão. Se o seu rmdir não tiver a opção de ignorar, apenas redirecione 2>/dev/null para não ter os avisos.

    
por 22.04.2016 / 16:27
2
find "$DIR_TO_CLEAN" -type d -empty -delete -print

Pode remover -print para não obter lista de diretórios excluídos.

Edit: Se você não quiser remover o diretório "$ DIR_TO_CLEAN", adicione -mindepth:

find "$DIR_TO_CLEAN" -mindepth 1 -type d -empty -delete -print
    
por 22.04.2016 / 17:59