정기적으로 간단한 텍스트 파일 목록을 구문 분석하고 업데이트하고 싶은 정기적으로 업데이트되는 폴더 세트가 있습니다. 목록은 rsync와 함께 사용되므로 더 쉬운 동기화를 위해 sed를 사용하여 파일 이름을 줄였습니다.
그것들은 다음과 같이 설정됩니다:
- 소프트웨어 폴더
- 소프트웨어 버전_1
- 버전_1.1
- 일부 파일
- 버전_베타
- 일부 파일
- 버전_1.1
- 소프트웨어 버전_2
- 버전_2.2
- 일부 파일
- 버전_베타
- 일부 파일
- 버전_2.2
- 소프트웨어 버전_1
나는 비슷한 것을 시도했습니다 :
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
이는 경로 어딘가에 상위 디렉토리가 있는 모든 새 파일을 찾고,
BETA
find에 대한 규칙이 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로 구분된 입력을 이해하는 도구를 사용하여 읽어야 합니다.