`rm -rf`를 실행할 때 특정 서브 디렉토리를 제외 할 수 있습니까? 여러 논리 볼륨 /

필자는 바인드 마운트를 사용하여 여러 논리 볼륨 / 물리적 파티션 / LUN 등을 보유하지 않고도 여러 위치에서 공간을 사용할 수 있도록 돕고 있습니다.

예를 들어 200G LV를 /space. 거기에서, 나는 하위 디렉토리를 만들 것이다. var_optvar_log 마운트를 바인드 할 수 있습니다. /var/opt/var/log로 나타났다.

‘space’디렉토리에서 정리를 수행하면 들어오지 못하게 하다 디렉토리의 rm -rf 내부에서 뛰다 /space?

예:

# pwd
/space
# rm -rf * {except-for-var_opt-and-var_log}

내가 생각하지 못한 것을 이루기 위해 노력하고있는 것을 성취하기위한 다른 (더 간단하지만) 좋은 방법이 있는가?



답변

어쩌면 find + xargs + rm 조합으로?

find /space ! -iregex '(var_opt|var_log)' | xargs rm -f

또는 그 곡의 어떤 것. 물론 xargs가 rm으로 변경하기 전에 echo 같은 더 무해한 것을 실행하도록 지시하는 것이 현명 할 수도 있습니다 …


답변

단순한 개념으로 오류 위험이 적습니다.

mkdir TO_DELETE
mv * TO_DELETE
mv TO_DELETE/var_opt TO_DELETE/var_log .
rm -rf TO_DELETE

ksh의 확장 된 glob을 사용할 수도 있습니다 :

rm -rf !(var_opt|var_log)

이것들은 bash로 가능하게하는 경우에도 사용할 수 있습니다 :

shopt -s extglob
rm -rf !(var_opt|var_log)

zsh의 내용 :

setopt ksh_glob
rm -rf !(var_opt|var_log)

Zsh에는 확장 된 glob가 있습니다.

setopt extended_glob
rm -rf ^var_(opt|log)


답변

입력 파일 이름이 사용자에 의해 생성되는 경우 처리해야합니다.
공백을 포함하는 놀랄만한 파일 이름 ‘또는 “파일 이름에.

사용 xargs ~ 때문에 불쾌한 놀라움으로 이어질 수 있습니다. 분리기 문제 .

GNU 병렬 그 문제는 없습니다.

find /space ! -iregex '(var_opt|var_log)' | parallel -X rm -f

조심해. GNU 병렬 용 소개 비디오 더 배우기.


답변

보존하려는 디렉토리가 마운트 포인트와 정확히 일치하면 사용할 수 있습니다. --one-file-system GNU에서 rm.

나는 이것이 어떻게 구현되었는지 조사하지는 않았지만 bind 마운트가 같은 파일 시스템 내에서 이루어 졌다면 이것이 원하는 것을하지 않을 것이라고 생각합니다. rm ~이 없다 --no-act 옵션,하지만 파이프 수 있습니다. yes no | rm -ir . 예를 들면.


답변