각 폴더에서 첫 번째 파일과 마지막 파일을 재귀적으로 가져오는 Bash 명령

각 폴더에서 첫 번째 파일과 마지막 파일을 재귀적으로 가져오는 Bash 명령

디렉토리가 있습니다

내 주요 디렉토리는/tmp/folder

그 안에는 /tmp/folderX 폴더(파일 아님)만 있습니다 . 예를 들어

/tmp/folder/1
/tmp/folder/2
/tmp/folder/3
/tmp/folder/4
/tmp/folder/5

이 폴더 안에는 동일한 확장자를 가진 파일이 많이 있습니다. 각 폴더에서 마지막 및 처음 생성된 파일(수정 시간)을 가져오고 싶습니다.

나는 이런 출력을 선호한다

/tmp/folder/1,OLD_FILE,NEW_FILE
/tmp/folder/2,OLD_FILE,NEW_FILE
/tmp/folder/3,OLD_FILE,NEW_FILE
/tmp/folder/4,OLD_FILE,NEW_FILE
/tmp/folder/5,OLD_FILE,NEW_FILE

스크립트를 사용하여 이 출력을 구문 분석할 것이므로 출력에 대해 원하는 모든 작업을 수행할 수 있지만 쉽게 구문 분석할 수 있도록 친숙한 방식으로 수행하십시오.

bash 명령은 1이어야 합니다.

답변1

find "$DIR" -type d | while read d; do echo "$d,$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')"; done

또는 더 읽기 쉬운 형식으로 데모를 위해 추가 변수를 사용합니다.

find "$DIR" -type d |
while read d;
do
    files=$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')
    printf '%s,%s\n' "$d" "$files";
done

$DIR이 명령을 사용하면 모든 하위 디렉터리를 찾을 수 있습니다 find. 발견된 각 파일에 대해 ls -tr최신 항목부터 날짜별로 정렬된 해당 디렉터리의 파일 목록을 가져옵니다.

출력을 파이프하여 첫 번째 줄과 마지막 줄을 쉼표로 ls -tr연결합니다 . 옵션은 기본 출력을 억제하고 첫 번째 줄(최신 파일 이름)을 다음 위치에 저장합니다.sed-n1h예비 공간$, 예약된 공간(최신 파일 이름)을 파일의 마지막 줄에 있는 패턴 공간(개행으로 구분)에 추가하고(선택하여 ) H개행을 쉼표로 변경합니다.

그런 다음 스크립트 printf는 하위 디렉터리 이름, 쉼표, sed.

ls -t이는 가장 오래된/최신 선택된 디렉터리와 파일 간에 차이가 없으므로 원하지 않는 경우 디렉터리를 제거하도록 출력을 필터링해야 합니다 .

관련 정보