최근 수정된 파일이 포함된 특정 폴더 이름을 가진 폴더를 찾고 나열하는 방법은 무엇입니까?

최근 수정된 파일이 포함된 특정 폴더 이름을 가진 폴더를 찾고 나열하는 방법은 무엇입니까?

정기적으로 간단한 텍스트 파일 목록을 구문 분석하고 업데이트하고 싶은 정기적으로 업데이트되는 폴더 세트가 있습니다. 목록은 rsync와 함께 사용되므로 더 쉬운 동기화를 위해 sed를 사용하여 파일 이름을 줄였습니다.

그것들은 다음과 같이 설정됩니다:

  • 소프트웨어 폴더
    • 소프트웨어 버전_1
      • 버전_1.1
        • 일부 파일
      • 버전_베타
        • 일부 파일
    • 소프트웨어 버전_2
      • 버전_2.2
        • 일부 파일
      • 버전_베타
        • 일부 파일

나는 비슷한 것을 시도했습니다 :

for dir in `find -maxdepth 2 -type d -name '*BETA'`; do test `find $dir -type f -mtime -1` | echo $dir | sed "s|^\./||" >> list.txt; done

그러나 출력에는 여전히 모든 베타 폴더가 나열됩니다(그리고 .aspx파일에 "알 수 없는 피연산자" 오류가 표시됩니까?).

수정된 파일을 하나 이상 찾고 폴더 목록을 업데이트한 후 스크립트가 다음 폴더로 이동할 수 있으므로 각 폴더의 나머지 파일을 반복할 필요가 없다면 추가 이점이 될 것입니다.

답변1

*BETA새 파일이 포함된 모든 디렉토리( )를 찾고 -mtime -1해당 디렉토리 이름을 여기에 저장하려면 list.txt다음을 시도하십시오.

find -type f -path '*BETA/*' -mtime -1 | sed 's|^\./||; s|BETA/.*|BETA|' | sort -u >list.txt

여러분의 목표는 파일에 줄바꿈으로 구분된 데이터를 생성하는 것이므로 list.txt이는 디렉터리나 파일의 이름 자체에 줄바꿈이 포함되는 것을 원하지 않는다는 의미입니다. 그렇다면 물론 다른 출력 형식이 필요합니다.

어떻게 작동하나요?

  • find -type f -path '*BETA/*' -mtime -1

    이는 경로 어딘가에 상위 디렉토리가 있는 모든 새 파일을 찾고, BETAfind에 대한 규칙이 new를 정의할 때 해당 이름은 -mtime -1.

  • sed 's|^\./||; s|BETA/.*|BETA|'

    이렇게 하면 파일 이름에서 첫 번째 문자가 제거되고 ./결과 BETA는 BETA 디렉터리의 이름이 됩니다.

  • sort -u

    생성된 디렉터리 목록에는 sed중복된 항목이 있습니다. 중복 항목이 제거됩니다.

  • >list.txt

    이렇게 하면 출력이 다음 위치에 저장됩니다.list.txt

보다 일반적인 솔루션

다음 방법은 디렉터리나 파일 이름에 개행 문자가 포함되어 있어도 안전합니다(GNU 도구가 필요할 수 있음).

find -type f -path '*BETA/*' -mtime -1 -print0 | sed -z 's|^\./||; s|BETA/.*|BETA|' | sort -zu >list.out

list.out그러면 null로 구분된 형식의 디렉터리 이름이 포함된 파일이 생성됩니다 . 파일이나 디렉터리 이름에 Null 문자가 표시되지 않으므로 이는 안전한 접근 방식입니다. 를 사용하려면 list.out물론 null로 구분된 입력을 이해하는 도구를 사용하여 읽어야 합니다.

관련 정보