![같은 이름을 가진 모든 디렉토리를 찾아 centos에서 모든 것을 삭제하십시오.](https://linux55.com/image/94253/%EA%B0%99%EC%9D%80%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EA%B0%80%EC%A7%84%20%EB%AA%A8%EB%93%A0%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EB%A5%BC%20%EC%B0%BE%EC%95%84%20centos%EC%97%90%EC%84%9C%20%EB%AA%A8%EB%93%A0%20%EA%B2%83%EC%9D%84%20%EC%82%AD%EC%A0%9C%ED%95%98%EC%8B%AD%EC%8B%9C%EC%98%A4..png)
내 서버에 100개의 Joomla 웹사이트가 있고 모든 Joomla 캐시 폴더를 정리하고 싶습니다. 이 작업을 수행하려면 다음 명령이 필요합니다.
1-이름이 "cache"인 모든 디렉터리를 찾습니다.
예를 들어 "/home/demo/" 디렉토리를 검색하면
최대 한 수준 더 깊은 "캐시" 디렉터리를 찾습니다. 예를 들면 다음과 같습니다.
/home/demo/ddf3e/
/home/demo/awda2/
이보다 더 깊어지는 건 없어
2-"캐시" 디렉터리 내의 모든 파일과 디렉터리를 정리합니다.
삭제하고 싶은 것만 삭제그 자체가 아니라
삼-모든 "cache" 디렉터리에 "index.html" 파일을 만듭니다.
미리 감사드립니다
답변1
가장 POSIX 접근 방식은 아마도 find
여러 -exec
옵션이 있는 명령을 사용하는 것입니다.
고쳐 쓰다:전체 POSIX 솔루션은 이 기사의 끝에 있습니다.
다음과 같은 경로 아래에서 "cache"라는 중첩 디렉터리를 찾을 수 있습니다 /home/demo
.
find /home/demo -mindepth 2 -maxdepth 2 -type d -name cache
mindepth
maxdepth
값은 검색2
을 바로 하위 디렉터리로 제한합니다.-type d
디렉토리만 찾도록 지정-name cache
이름이 정확히 "cache"인 일치 항목만 반환하도록 지시합니다.
그런 다음 이 -exec
옵션을 사용하여 일치하는 결과에 따라 작업을 수행할 수 있습니다. 예를 들어, ls
일치하는 각 캐시 디렉토리의 내용을 나열하기 위해 실행하려는 경우 :
find /home/demo -mindepth 2 -maxdepth 2 -type d -name cache -exec ls {} \;
-exec
ls
각 일치 항목에 대해 다음 명령과 ( )를 차례로 호출합니다.{}
일치하는 값을 반환합니다(이 경우 캐시 디렉터리 경로).\;
일치할 때마다 명령을 한 번씩 실행하도록 지시합니다.
따라서 해당 디렉터리의 내용을 삭제하려면 ls
위 명령을 다음 rm
과 같은 적절한 명령문 으로 바꿀 수 있습니다.sh -c 'rm "{}"/*'
예(이것을 실행하지 마세요):
find /home/demo -maxdepth 2 -mindepth 2 -type d -name cache -exec sh -c 'rm "{}"/* 2>/dev/null' \;
위의 예에서 sh -c
이는 쉘 확장이 중첩된 파일과 일치하도록 허용하는 데 사용됩니다 /*
(비록 POSIX는 아니지만). 그런 다음 다른 파일을 추가하여 -exec
추가 파일을 만들 수도 있습니다.
예(이것을 실행하지 마세요):
find /home/demo -maxdepth 2 -mindepth 2 -type d -name cache -exec sh -c 'rm "{}"/* 2>/dev/null' \; -exec touch "{}/index.html" \;
위의 예에서는 두 -exec
옵션이 함께 사용되었습니다. 두 번째 명령은 index.html
첫 번째 명령이 성공적으로 완료된 경우에만 실행되는 중첩 파일을 만듭니다 -exec
.
그러나 여러 개의 찾기 명령으로 분할하는 것이 좋습니다. 하나는 파일을 일치시키고 삭제하고 다른 하나는 index.html
.
예(이것을 실행하지 마세요):
find /home/demo -mindepth 3 -maxdepth 3 -wholename "/home/demo/*/cache/*" -exec rm -rf "{}" \;
find /home/demo -maxdepth 2 -mindepth 2 -type d -name cache -exec touch "{}/index.html" \;
첫 번째 진술에서:
-mindepth
자식의 자식 만 일치합니다-maxdepth
.3
-wholename "/home/demo/*/cache/*"
대상 캐시 디렉터리의 하위 디렉터리와 일치하는 항목을 제공합니다.
그런 다음 두 번째 문은 index.html
파일을 생성합니다.
귀하의 질문을 올바르게 이해했다면 이 명령은 다음에 유용합니다.아마도당신이 찾고있는 것을하십시오. 그러나 사용하기 전에 주의 깊게 읽고 완전히 이해했는지 확인하십시오.
어떤 명령이든 실행하기 전에 명령 앞에 접두어를 붙이는 것이 좋습니다 rm
. 이를 통해 연습을 수행하고 수행 중인 작업을 확인할 수 있습니다.touch
echo
예(안전한 시험 실행을 위해 사용 echo
):
find /home/demo -mindepth 3 -maxdepth 3 -wholename "/home/demo/*/cache/*" -exec echo rm -rf "{}" \;
find /home/demo -maxdepth 2 -mindepth 2 -type d -name cache -exec echo touch "{}/index.html" \;
업데이트 - 전체 POSIX 솔루션(그러나 읽기가 더 어려움):
전체 POSIX에 해당하는 경우( mindepth
/ 제외) 내부 와일드카드를 사용하여 양수/음수 조합을 사용할 maxdepth
수 있습니다 .wholename
-path
find
cd
glob 패턴에 대한 기본 디렉터리를 계산할 필요가 없기 때문에 먼저 작업 트리로 이동하면 훨씬 쉽습니다 .
cd /home/demo
find . -path "./*/cache/*" ! -path "./*/*/*/*" -exec echo rm -rf {} \;
find . -type d -path "./*/cache" ! -path "./*/*/*" -exec echo touch {}/index.html \;
echo
예상한 결과를 얻으면 다음 문을 삭제하세요.
답변2
/home/demo/foo/cache
그래서 제가 추측한 것이 맞다면, 예를 들어 의 모든 값을 찾고 싶을 것입니다 foo
. 깊게 파고들 필요가 없기 때문에 매우 간단합니다.
(1) Shell glob을 사용하여 나열할 수 있습니다.
$ cd /home/demo
$ echo */cache
-foo
대시( )로 시작하는 이름과 같은 이상한 이름을 방지하려면 를 사용하는 것이 좋습니다 ./*
. 또는 bash에서 를 사용하여 점으로 시작하는 이름을 포함하는 glob을 만들 수 있습니다 shopt -s dotglob
.
(2) 디렉토리에서 파일을 찾아 삭제합니다(GNU find를 사용하면 -mindepth 1
파일이 디렉토리 자체와 일치하지 않습니다).
$ shopt -s dotglob
$ find ./*/cache -mindepth 1 # list them
./awda2/cache/foo
[...]
$ find ./*/cache -mindepth 1 -delete # delete them...
그냥 사용할 수도 있지만 rm
파일 수가 많으면 명령줄 길이 제한을 초과할 수 있습니다.
$ rm -r ./*/cache/*
(3) 모든 항목에 파일을 생성하거나 복사합니다( touch
빈 파일 생성).
$ for dir in ./*/cache ; do touch "$dir/index.html" ; done
$ for dir in ./*/cache ; do cp index.html.model "$dir/index.html" ; done
(있는 경우문서(디렉토리 아님) 이름을 지정 cache
하면 무해한 오류가 발생합니다. )