모든 빈 디렉터리와 .DS_Store
Mac에서 생성 하는 파일 만 포함하는 디렉터리를 삭제하는 bash 스크립트를 작성하려고합니다 . 나는 전자를 꽤 쉽게 find -depth -type d -empty
할 수 있지만 .NET 만 포함 하는 디렉토리를 찾는 방법을 알 수 없습니다 .DS_Store
.
재귀 검색 기능을 작성하지 않고 쉽게 수행 할 수있는 방법이 있습니까?
다음은 POSIX find 및 POSIX sh에만 의존하는 솔루션입니다. 모든 디렉토리를 나열한 다음라는 항목 만 포함 된 디렉토리를 필터링합니다 .DS_Store
.
find -type d -exec sh -c '
cd "$0" &&
for x in * .[!.]* ..?*; do
if [ "$x" = ".DS_Store" ]; then continue; fi;
if [ -e "$x" ] || [ -L "$x" ]; then exit 1; fi;
done' {} \; -print
find
모든 디렉토리를 재귀 적으로 열거 하는 데 사용 합니다.sh
쉘 코드를 실행하기 위해 호출 합니다.for
루프는 디렉토리에있는 모든 파일을 열거합니다..DS_Store
.[ -e "$x" ] || [ -L "$x" ]
끊어진 기호 링크를 포함한 모든 파일을 캡처합니다. 일치하지 않는 유일한 방법은 패턴이 변경되지 않은 경우입니다.exit 1
이외의 파일이 있으면 실행 .DS_Store
되고 그렇지 않으면 성공하면 0을 반환합니다.-print
에 -exec …
당신이 이름을 인쇄 이외의 작업을 수행하려는 경우.다음은 zsh의 솔루션입니다. echo
실행하려는 명령으로 변경하십시오 .
setopt extended_glob
echo **/*(/DNe\''a=($REPLY/^.DS_Store(DNY1)); ((!#a))'\')
**/*
모든 파일을 재귀 적으로 열거합니다./
, **/*(/)
재귀 적으로 모든 디렉토리를 열거합니다.N
는 일치하는 항목이없는 경우 빈 목록을 가져 오도록합니다 (기본적으로 zsh는 오류를 나타냄).D
는 도트 파일이 포함되도록합니다.e\''CODE'\'
CODE
CODE
CODE
$REPLY
^.DS_Store
호출되지 않은 파일과 일치합니다 .DS_Store
..DS_Store
는 이외의 파일 수가 0 인 항목에 대한 일치를 제한합니다 .Y1
는 일치 항목을 하나로 제한합니다 (효율성 향상 일뿐입니다).다음은 Python의 솔루션입니다 (2와 3 모두에서 작동). 이것이 한 줄로 압축 되었음에도 불구하고 구조는 다소 명확합니다.
python -c 'import os; print("\n".join([path for path, dirs, files in os.walk(".") if dirs == [] and files in ([], [".DS_Store"])]))'
os.walk
인수 아래에 재귀 적으로 디렉토리 목록을 반환합니다. 각 디렉토리에 대해 (디렉토리 path
경로), dirs
(하위 디렉토리 목록) 및 files
(디렉토리 자체가 아닌 디렉토리의 파일 목록 )을 포함하는 트리플을 생성합니다 .[… for … in os.walk(…) if …]
의 결과를 필터링합니다 os.walk
.if
절은 하위 디렉토리가없고 .NET 이외의 파일이없는 경우에만 요소를 유지합니다 .DS_Store
.이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다