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


4

필자는 바인드 마운트를 사용하여 여러 논리 볼륨 / 물리적 파티션 / 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}

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

답변:


1

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

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

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


그걸 생각하지 않았어! 좋은 생각 :)
warren

4
xargs를 사용하지 마십시오. (를 제외하고 -0 )! 입력은 매우 특이한 방식으로 인용됩니다. find 생성되지 않습니다. 공백이 포함 된 파일 이름이 있거나 \'". 대신, -exec: find / space! -iregex '(var_opt | var_log)'-exec rm {} + . Or since -iregex`는 GNU에서만 찾을 수 있습니다. -delete 동작: find /space ! -iregex '(var_opt|var_log)' -delete.
Gilles

11

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

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)

2

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

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

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

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

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


1

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.