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 find
AND 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 {} \;