답변:
rm을 사용하는 대신 find 를 사용하는 것이 더 쉬울 수 있습니다 . 이와 같은 명령은 정확히 'file'이라는 파일을 제외한 모든 것을 삭제합니다.
find . \! -name 'file' -delete
많은 버전은 글 로빙 및 정규식 일치를 지원할 수 있어야합니다.
또한 find의 결과를 rm으로 파이프 할 수도 있습니다.
find . \! -name '*pattern*' -print0 | xargs --null rm
-delete뿐만 아니라 파일이 저장됩니다 무엇에 의해 제거 -delete하고 \!.
find재귀입니다! 따라서 ' pattern '과 일치하지 않는 모든 파일 하위 디렉토리도 삭제됩니다.
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r
주의 : 명령을 실행하고 삭제할 파일이 올바른 파일이면 다시 실행하고 해시 문자 "#"을 삭제하십시오.
파일 이름이 더 복잡하면 그렇게하십시오.
ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r
다시 한 번 결과를보고 해시 부호를 제거하십시오.
주석에서 제안한이 버전은 일부 문자를 저장하고 조금 더 명확 해 보입니다.
ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
a, b그리고 a b첫 번째 프로그램이 삭제됩니다 - 당신은 grep 부분에 AB를 넣을 경우 : "^[ab]$" a및 b하지만 a b, 당신의 의도에 반대했다. 두 번째 명령도 동일하게 수행됩니다. 그리고 세 번째도. 매우 드문 경우를 제외하고 스크립트에서 'ls'를 사용해서는 안됩니다. 하지 마십시오.
보관하려는 파일을 이동하십시오. 한 수준 위로 이동하여 폴더를 삭제하십시오. 폴더를 다시 만들고 해당 파일을 다시 이동하십시오.
/합니까? 실용적이지 않습니다. c) 귀하의 모든 파일을 제거하려고 시도하는 $HOME것도 실제로 실용적이지 않습니다.
이것이 내가 OSX / MacOS 로그 아웃 후크를위한 .sh 스크립트로 설정 한 것입니다.
#! /bin/bash
for dir in /PathToFolder/*
do
if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then
echo ${dir}
sudo rm -R $dir user
dscl . -delete $dir
fi
done
exit 0
GNU-find를 사용하면 비어있는 경우 디렉토리를 제거하는 -delete 스위치를 사용할 수 있습니다.
find tmp -not -name X -not -name Y -not -name Z -delete
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete이 문제를 해결하는 한 가지 방법입니다.
tmp이 없으면 삭제 될 것입니다. GNU와 동등한 표준 ( GNU 확장) 으로 주목하십시오XYZ!-not-delete