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