일일 스크립트를 사용하여 폴더 내의 모든 폴더를 삭제해야 합니다. 해당 날짜의 폴더를 보관해야 합니다.
"myfolder" 폴더에는 "test1", "test2", "test3"이라는 3개의 하위 폴더가 있으며 "test2"를 제외한 모든 하위 폴더를 삭제해야 합니다.
여기서 정확한 이름을 일치시키려고 합니다.
find /home/myfolder -type d ! -name 'test2' | xargs rm -rf
또는
find /home/myfolder -type d ! -name 'test2' -delete
이 명령은 항상 기본 폴더 "myfolder"를 삭제하려고 시도합니다! 이것을 피할 수 있는 방법이 있나요?
답변1
./myfolder
이 폴더를 제외한 모든 폴더가 삭제되고 ./myfolder/test2
해당 폴더의 모든 내용은 보존됩니다.
find ./myfolder -mindepth 1 ! -regex '^./myfolder/test2\(/.*\)?' -delete
어떻게 작동하나요?
find
찾기 명령을 시작합니다../myfolder
./myfolder
find 디렉토리와 그 내용부터 시작 하도록 지시합니다 .-mindepth 1
자체적으로는 일치하지 않으며./myfolder
그 아래의 파일 및 디렉터리만 일치합니다.! -regex '^./myfolder/test2\(/.*\)?'
!
정규식과 일치하는 모든 파일이나 디렉터리를 제외()하도록 find에 지시합니다^./myfolder/test2\(/.*\)?
.^
경로 이름의 시작 부분과 일치합니다. 이 표현식은(/.*\)?
(a) 슬래시 뒤에 오는 항목 또는 (b) 전혀 일치하지 않는 항목과 일치합니다.-delete
일치하는(즉, 제외되지 않은) 파일을 삭제하도록 find에 지시합니다.
예
다음과 같은 디렉토리 구조를 생각해 보십시오.
$ find ./myfolder
./myfolder
./myfolder/test1
./myfolder/test1/dir1
./myfolder/test1/dir1/test2
./myfolder/test1/dir1/test2/file4
./myfolder/test1/file1
./myfolder/test3
./myfolder/test3/file3
./myfolder/test2
./myfolder/test2/file2
./myfolder/test2/dir2
-delete
일치하는 항목을 확인하려면 find 명령( 없이)을 실행할 수 있습니다 .
$ find ./myfolder -mindepth 1 ! -regex '^./myfolder/test2\(/.*\)?'
./myfolder/test1
./myfolder/test1/dir1
./myfolder/test1/dir1/test2
./myfolder/test1/dir1/test2/file4
./myfolder/test1/file1
./myfolder/test3
./myfolder/test3/file3
나머지 파일을 살펴보면 이것이 작동하는지 확인할 수 있습니다.
$ find ./myfolder
./myfolder
./myfolder/test2
./myfolder/test2/file2
./myfolder/test2/dir2
답변2
shopt -s extglob
rm -r myfolder/!(test2)/
예:
$ tree myfolder/
myfolder/
├── test1
│ └── file1
├── test2
│ └── file2
└── test3
└── file3
$ echo rm -r myfolder/!(test2)
rm -r myfolder/test1 myfolder/test3
$ rm -r myfolder/!(test2)
$ tree myfolder/
myfolder/
└── test2
└── file2
1 directory, 1 file
답변3
너무 길어요.
find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 \
-exec echo rm -rf '{}' \;
파일 목록에 만족하면 에코를 제거하십시오.
사용하면 -mindepth 1
보장됩니다맨 위선택한 디렉터리가 없습니다.
$ find ./myfolder -mindepth 1 -type d
./myfolder/test2
./myfolder/test2/one
./myfolder/test2/two
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3
-not -name test2
하지만 의지 는 있어아니요다음 내부의 하위 디렉터리를 피하세요 test2
.
$ find ./myfolder -mindepth 1 -type d -not -name 'test2'
./myfolder/test2/one
./myfolder/test2/two
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3
이를 위해서는 자두와 같은 것이 필요합니다.
$ find ./myfolder -mindepth 1 -name test2 -prune -o -type d -print
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3
하지만delete
암시하는 대로 사용하지 않으면 depth
가장 긴 경로에서 제거가 시작됩니다.
$ find ./myfolder -depth -mindepth 1 -name test2 -prune -o -type d -print
./myfolder/test/a1/a2/a3
./myfolder/test/a1/a2
./myfolder/test/a1
./myfolder/test
다음을 사용하거나 rm -rf
실제로 삭제하려면 삭제하세요.echo
$ find ./myfolder -mindepth 1 -name test2 -prune -o -type d -exec echo rm -rf '{}' \;
rm -rf ./myfolder/test
rm -rf ./myfolder/test/a1
rm -rf ./myfolder/test/a1/a2
rm -rf ./myfolder/test/a1/a2/a3
또는,반품maxdepth
필요한 것이 디렉토리(및 그 안의 모든 것)를 삭제하는 것뿐이라면 ( echo
실제로 지우려면 삭제)를 사용하십시오.
$ find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 -exec echo rm -rf '{}' \;
rm -rf ./myfolder/test
-delete
디렉터리가 비어 있지 않으면 A는 여전히 실패합니다.
$ find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 -delete
find: cannot delete ‘./myfolder/test’: Directory not empty
답변4
요구 사항이 질문에 언급된 수준(깊이 1 이하)에만 적용되는 경우 다음은 또 다른 간단한 옵션입니다.
ls myfolder/ | grep -v "test2" | xargs rm -r
세부 사항:
ls myfolder/
myfolder/
디렉토리의 모든 폴더 및 파일 나열grep -v "test2"
"test2"를 제외한 모든 것과 일치합니다.xargs rm -r
이전 명령의 출력을rm -r
다른 명령으로 파이프합니다.