Attic이라는 하위 폴더만 포함하는 폴더 나열

Attic이라는 하위 폴더만 포함하는 폴더 나열

Git으로 마이그레이션하기 전에 CVS 저장소를 정리하고 있습니다. 준비의 일환으로 Attic폴더만 포함된 폴더를 찾아서 삭제해야 합니다 .

내 unix-fu는 강력하지 않지만 이것이 내가 시도한 것이며 작동하지 않지만 바라건대 의도가 전달되기를 바랍니다.

shopt -s globstar
for file in **/*
do
  if [ -d "$file" ];then
    if [`ls | wc -l` == 1 && `ls Attic | wc -l` == 1]; then
      ((echo Attic-only folder))
    fi
  fi
done

두 번째 부분은 빈 폴더(또는 폴더 체인)를 찾는 것입니다.

예를 들어, /foo/bar/Attic삭제되어 /foo/bar이제 모두 비어 있으면 트리의 해당 부분도 종료합니다.

배경: Git으로 마이그레이션하기 위해 CVS 저장소를 정리하려고 합니다. CVS는 Attic삭제된 파일을 위한 폴더를 생성합니다. 지난 10년 동안 몇 가지 나쁜 일이 일어났습니다. 나는 위험과 영향을 완전히 이해합니다. 데이터를 백업하고 복사본을 만들고 있습니다.

답변1

AND bash, GNU findAND comm:

comm -12 \
    <( find /path/to/CVS/repo -printf '%h\n' \
        sort | uniq -u ) \
    <( find /path/to/CVS/repo -name Attic -type d -printf '%h\n' | \
        sort )

첫 번째 s()는 find저장소의 모든 내용, 파일 및 디렉터리를 인쇄합니다 basename. 그런 다음 하위 항목, 파일 또는 디렉터리가 하나만 있는 디렉터리를 인쇄합니다.-printf '%h\n'sort | uniq -u

그런 다음 두 번째 것은 find디렉토리 basename의 s를 인쇄합니다 Attic. 이 세트와 위의 세트(예: comm -12)의 교차점은 정확히 하위 항목만 있는 디렉토리입니다 Attic.

물론 이는 심볼릭 링크와 기타 재미있는 내용은 물론 개행 문자가 포함된 파일 이름도 무시합니다. 어떤 경우에도 CVS 저장소에 넣지 마십시오.

답변2

bash에서 형제가 없는 모든 Attic폴더를 찾으세요 ..

find . -type d -name Attic -print0 | while read -d $'\0' DIR ;\
    do [[ $(ls -1 "$DIR/.." | wc -l) -eq 1 ]] && echo "$DIR" ; done

echo선호하는 파일 처리 명령으로 바꾸세요 ;-).

답변3

첫 번째 부분은 일부 Python으로 수행하는 것이 가장 쉬운 것 같습니다.

#!/usr/bin/env python

import os, sys

for topdir in sys.argv:
    for root, dirs, files in os.walk(topdir):
        if not files and len(dirs) == 1 and dirs[0] == 'Attic':
            print os.path.join(root)

다음과 같이 실행하세요:

./script.py /path/to/CVS/repo

파일 이름에 개행 문자가 포함되어 있지 않고 협력 xargs(예: -d해당 옵션이 있는 파일)이 있다고 가정하고 디렉터리를 삭제하려면 다음을 수행하세요.

./script.py /path/to/CVS/repo | xargs -d '\n' rm -rf

그래도 작동하지 않으면 xargs스크립트를 수정하여 NUL종료 문자열을 인쇄할 수 있습니다.

#!/usr/bin/env python

from __future__ import print_function
import os, sys

for topdir in sys.argv:
    for root, dirs, files in os.walk(topdir):
        if not files and len(dirs) == 1 and dirs[0] == 'Attic':
            print(os.path.join(root), end="\0")

xargs -0그런 다음 다음을 사용하여 디렉토리를 종료 할 수 있습니다 .

./script.py /path/to/CVS/repo | xargs -0 rm -rf

나중에 빈 디렉토리를 죽이려면:

find /path/to/CVS/repo -depth -type d -empty -delete

답변4

이 명령을 시도해 보세요

find $(find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; |  awk '$NF==1{print $1}') -name Attic -exec rm -r {} \;

관련 정보