하나를 제외하고 상위의 모든 파일 삭제

하나를 제외하고 상위의 모든 파일 삭제

경로 안에 있고 그 안의 모든 항목을 /parent/child1/child2삭제하려는 경우( . 제외 ) 이 명령이 어떻게 실행되는지 알려줄 수 있는 사람이 있나요?parentchild2child1parent

답변1

bash쉘을 사용한다고 가정합니다 .

shopt -s dotglob extglob
rm -rf ../../!(child1)

여기의 명령은 shopt쉘에서 두 가지 쉘 옵션을 활성화합니다 bash. 먼저 dotglob숨겨진 이름이 파일 이름 와일드카드 패턴과 일치하는지 확인하세요. 두 번째인 는 extglob일부 확장된 글로빙 패턴(원래 ksh셸에서)을 활성화합니다.

parent두 번째 줄은 확장된 와일드카드 패턴을 사용하여 디렉토리의 이름을 제외한 모든 항목을 일치시킵니다 child1. 이 디렉터리의 내용은 parent우리보다 두 수준 위에 있으므로 먼저 사용한 다음 name을 제외한 모든 것과 일치하는 패턴을 추가합니다 ../../.!(child1)child1

rm -rf일치하는 모든 이름을 (재귀적) 제거 에 전달합니다 .

../../!(child1)패턴에서 상대 경로를 사용하는 대신 디렉터리에 대한 절대 경로를 사용할 수도 있습니다 parent. 귀하의 질문에 따르면 절대 경로는 이므로 /parent패턴은 이 됩니다 /parent/!(child1). parent디렉터리를 기준으로 한 실제 위치가 확실하지 않은 경우 절대 경로를 사용하는 것이 더 안전할 수 있습니다.


이 문제를 해결하는 또 다른 확실한 방법은 child1먼저 디렉터리를 다른 곳으로 이동하고 parent디렉터리를 삭제하고 다시 만든 다음 child1디렉터리를 다시 제자리로 이동하는 것입니다.

여기서는 절대 경로 이름을 사용하고 있습니다(상대 경로 이름을 사용하면 현재 디렉토리를 기준으로 이동하므로 혼란스러울 수 있습니다 parent).

mv /parent/child1 /tmp
rm -rf /parent
mkdir /parent
mv /tmp/child1 /parent

답변2

GNU find가 있으면 이 명령을 사용할 수 있습니다.

find ../.. -depth -not -path "../../child1/*" -not -samefile ../.. -not -samefile ../../child1 -exec rm -r {} \;

당신이 실제로 그 안에 있는지 확인하십시오/parent/child1/child2

관련 정보