빈 디렉토리 찾기 UNIX
주어진 디렉토리 목록에 대해 빈 디렉토리를 찾아야합니다. 일부 디렉토리에는 내부에 디렉토리가 있습니다.
내부 디렉토리도 비어 있으면 기본 디렉토리가 비어있는 말할 수 있습니다. 언어는 비어 있지 않습니다.
어떻게 테스트 할 수 있습니까?
예를 들면 :
A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
find <dir> -type f
출력 여부를 확인하십시오 . 다음은 예입니다.
for dir in A B C; do
[ -z "`find $dir -type f`" ] && echo "$dir is empty"
done
빈 디렉토리로 무엇을 하려는지에 따라 조금씩. 트리 내의 모든 빈 디렉토리, 즉 디렉토리 를 삭제하려는 명령을 사용합니다 test
.
find test -depth -empty -delete
의 명령에 위 대해주의해야 우리 할 점은 빈 파일도 계명 제거 된다는 것이므로 타입 D 옵션을 사용하여 이를 방지하십시오.
find test -depth -type d -empty -delete
-delete
하는 파일과 일치 여부 디렉토리를 보려면 드롭 하십시오.
빈 디렉토리 트리의 정의에 파일이 포함되어 있지 않다면 find test -type f
반환 여부에 따라 행동을 함께 붙일 수 있습니다 .
find
훌륭한 유틸리티이며 RTFM은 초기에 그리고 종종 많은 일을 할 수 있습니다. :-)
다음 명령을 사용할 수 있습니다.
find . -type d -empty
find directory -mindepth 1 -type d -empty -delete
이것이 제가 가장 흥미롭게 버전입니다. 내부 디렉토리 에서 실행하면 아래의 모든 빈 디렉토리가 삭제됩니다 (빈 디렉토리 만 포함 된 디렉토리는 비어 있는 것으로 간주 됨 ).
mindepth 옵션은 비어있는 경우 디렉토리 자체가 삭제되는 것을 방지합니다.
find . -type d -empty
현재 트리에서 빈 디렉토리와 하위 디렉토리를 찾아합니다. 예 : 빈 디렉토리 및 하위 디렉토리의 결과 목록 :
./2047
./2032
./2049
./2063
./NRCP26LUCcct1/2039
./NRCP26LUCcct1/2054
./NRCP26LUCcct1/2075
./NRCP26LUCcct1/2070
디렉토리에서 작업이 수행되지 않습니다. 그들은 그들의 마음에 드는 것입니다. 이것은 나를 위해 작동합니다.
빈 dirs를 찾으십시오.
빈 디렉토리 (질문 제목에 지정된대로) mosg의 대답 이 맞습니다.
find -type d -empty
그러나 -empty
아주 오래된 find
버전에서는 사용할 수 없습니다 ( 예 : HP-UX 의 경우 ). 이 경우 아래 섹션에 설명 된 기술을 참조하십시오 . 어디에 있습니까? .
빈 디렉토리 삭제
이것은 약간 까다 롭습니다. 디렉토리 MyDir
에 빈 디렉토리가 포함되어 있어 가정합니다 . 디렉토리 제거를 제거하면 빈 디렉토리를 MyDir
제거해야합니다. 따라서 가능한 경우 부모 디렉터리도 제거 rmdir
하는 옵션 --parents
(또는 -p
) 과 함께 명령 을 사용 합니다.
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
이전 find
버전에서는이 명령문 +
이 아직 지원되지 않으므로 ;
대신 다음을 사용할 수 있습니다 .
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
디렉토리가 비어 있습니까?
이 답변의 대부분은 디렉토리가 비어 있는지 확인하는 방법을 설명합니다. 따라서 여기에 내가 아는 세 가지 기술을 제공합니다.
[ $(find your/dir -prune -empty) = your/dir ]
d=your/dir if [ x$(find "$d" -prune -empty) = x"$d" ] then echo "empty (directory or file)" else echo "contains files (or does not exist)" fi
변형 :
d=your/dir if [ x$(find "$d" -prune -empty -type d) = x"$d" ] then echo "empty directory" else echo "contains files (or does not exist or is not a directory)" fi
설명:
find -prune
find -maxdepth 0
적은 문자를 사용하는 것과 유사 합니다.find -type d
디렉토리 만 인쇄find -empty
빈 디렉토리와 파일을 인쇄합니다.> mkdir -v empty1 empty2 not_empty mkdir: created directory 'empty1' mkdir: created directory 'empty2' mkdir: created directory 'not_empty' > touch not_empty/file > find empty1 empty2 not_empty -prune -empty empty1 empty2
(( ${#files} ))
이 트릭은 100 %
bash
이지만 하위 쉘을 호출 (스폰)합니다. 아이디어는 Bruno De Fraine에서 나 왔으며 teambob 의 의견으로 개선되었습니다 . bash 를 사용 하고 스크립트를 이식 할 필요가없는 경우이 방법을 조언합니다 .files=$(shopt -s nullglob dotglob; echo your/dir/*) if (( ${#files} )) then echo "contains files" else echo "empty (or does not exist or is a file)" fi
참고 : 빈 디렉토리와 존재하지 않는 디렉토리 사이에는 차이가 없습니다 (제공된 경로가 파일 인 경우에도).
[ $(ls -A your/dir) ]
이 트릭은 2007 년에 게시 된 nixCraft의 기사 에서 영감을 얻었습니다 . Andrew Taylor 는 2008 년에, gr8can8dian 은 2011 년에 답변했습니다 .
if [ "$(ls -A your/dir)" ] then echo "contains files" else echo "empty (or does not exist or is a file)" fi
또는 한 줄 bashism 버전 :
[[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
참고 : 디렉토리가 존재하지 않을 때
ls
반환$?=2
됩니다. 그러나 파일과 빈 디렉토리 사이에는 차이가 없습니다.
이 재귀 함수는 트릭을 수행하는 것처럼 보입니다.
# Bash
findempty() {
find ${1:-.} -mindepth 1 -maxdepth 1 -type d | while read -r dir
do
if [[ -z "$(find "$dir" -mindepth 1 -type f)" ]] >/dev/null
then
findempty "$dir"
echo "$dir"
fi
done
}
이 예제 디렉토리 구조가 주어지면 :
. |-dir1 / |-dir2 / | `-dirB / |-dir3 / | `-dirC / | `-file5 |-dir4 / | |-dirD / | `-file4 `-dir5 / `-디렉토리 / `-dir_V /
해당 함수를 실행 한 결과는 다음과 같습니다.
./dir1 ./dir5/dirE/dir_V ./dir5/dirE ./dir5 ./dir2/dirB ./dir2
그리워 /dir4/dirD
합니다. 당신은 재귀 호출 이동하면 findempty "$dir"
애프터을 fi
, 함수는 그 결과에 해당 디렉토리에 포함됩니다.
어때요 rmdir *
? 이 명령은 비어 있지 않은 디렉토리에서 실패합니다.
다음과 같이 간단한 구조를 만들었습니다.
test/
test/test2/
test/test2/test2.2/
test/test3/
test/test3/file
에 test/test3/file
정크 텍스트가 있습니다.
발행 하면 find test -empty
" test/test2/test2.2
"이 유일한 빈 디렉토리로 리턴 됩니다.
간단한 접근 방식은
$ [ "$(ls -A /path/to/direcory)" ] && echo "not empty" || echo "its empty"
또한,
if [ "$(ls -A /path/to/direcory)" ]; then
echo "its not empty"
else
echo "empty directory"
find . -name -type d -ls |awk '($2==0){print $11}'
참고 URL : https://stackoverflow.com/questions/2810838/finding-empty-directories-unix
'IT' 카테고리의 다른 글
AWS CLI $ PATH 설정 (0) | 2020.09.08 |
---|---|
스토리 보드 / xib 파일에서 UIImage renderingMode 수정 (0) | 2020.09.08 |
속성 값으로 배열을 필터링하는 Rails (0) | 2020.09.07 |
더 빠른 것 : in_array 또는 isset? (0) | 2020.09.07 |
다른 작업 내에서 작업 호출 (0) | 2020.09.07 |