같은 이름을 가진 모든 디렉토리를 찾아 centos에서 모든 것을 삭제하십시오.

같은 이름을 가진 모든 디렉토리를 찾아 centos에서 모든 것을 삭제하십시오.

내 서버에 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
  • mindepthmaxdepth값은 검색 2을 바로 하위 디렉터리로 제한합니다.
  • -type d디렉토리만 찾도록 지정
  • -name cache이름이 정확히 "cache"인 일치 항목만 반환하도록 지시합니다.

그런 다음 이 -exec옵션을 사용하여 일치하는 결과에 따라 작업을 수행할 수 있습니다. 예를 들어, ls일치하는 각 캐시 디렉토리의 내용을 나열하기 위해 실행하려는 경우 :

find /home/demo -mindepth 2 -maxdepth 2 -type d -name cache -exec ls {} \;
  • -execls각 일치 항목에 대해 다음 명령과 ( )를 차례로 호출합니다.
  • {}일치하는 값을 반환합니다(이 경우 캐시 디렉터리 경로).
  • \;일치할 때마다 명령을 한 번씩 실행하도록 지시합니다.

따라서 해당 디렉터리의 내용을 삭제하려면 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. 이를 통해 연습을 수행하고 수행 중인 작업을 확인할 수 있습니다.touchecho

예(안전한 시험 실행을 위해 사용 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-pathfind

cdglob 패턴에 대한 기본 디렉터리를 계산할 필요가 없기 때문에 먼저 작업 트리로 이동하면 훨씬 쉽습니다 .

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하면 무해한 오류가 발생합니다. )

관련 정보