각 하위 폴더의 최신 파일 나열

각 하위 폴더의 최신 파일 나열

내 파일 구조는 다음과 같습니다

FOLDER/SUB_FOLDER/Text_File

나는 그것들 중 1,000개 이상을 가지고 있으며 FOLDER, 각각은 적어도 FOLDER2개의 서로 다른 것을 가지고 있습니다 .SUB_FOLDERSUB_FOLDERText_File

나는 가장 많은 것의 목록을 만들기 위해 나 자신에게 도전하려고 노력하고 있습니다.최근의 Text_FileFOLDER/(루트로)

My Pseudo code is (as well as commands I know right now): 
List all FOLDERS
 - **ls -t [EACH_FOLDER] | head -n1 **
    **ls -t EACH_FOLDER/SUB_FOLDER/**
      **ls Text_File**

출력은 다음과 같아야 합니다.

/FOLDER/SUB_FOLDER/Text_File

...

모든 파일.

내 목표는 모든 루트 디렉터리의 모든 최신 Text_File을 grep하여 FOLDER정보를 구문 분석하는 것입니다.

답변1

#!/bin/bash

# Array of root folders
folders=("a" "b")

# Search all specified root folders
for f in ${folders[@]}; do
    # Descend hierarchy and retrieve modification date of each file with "stat"
    find $f -type f -exec stat -f "%m,%N" {} ';' | \
        # sort by date, most recent first
        sort -gr | \
        # extract first (most recent) file
        head -1 | \
        # return file name only
        cut -d, -f2
done

답변2

당신은 gnu시도 할 수 있습니다:

find "$(pwd)" -mindepth 2 -maxdepth 2 -type d -printf "d%h\0%T@ %p\0" | awk -v RS="\0" '
  /^d/ {directoryname=substr($0,2)}
  /^[0-9]/ && (!lmtimes[directoryname] || lmtimes[directoryname] < $1) {
    lmtimes[directoryname]=$1;
    lmtimedns[directoryname]=substr($0,index($0," ")+1);
  }
  END {for (directoryname in lmtimedns) print lmtimedns[directoryname]}
  '

\n "이 버전은 특수 문자 등 이 포함된 이상한 이름에 대해 테스트되었습니다.

$(pwd)pwd현재 디렉터리의 절대 경로 이름을 인쇄하는 명령을 실행합니다 .

find $(pwd)현재 디렉토리를 검색하면 전체 디렉토리 경로 이름이 인쇄됩니다.

필터는 현재 디렉터리의 수준이 1이고 수준이 2인 -mindepth 2 -maxdepth 2 -type d두 번째 수준의 디렉터리만 선택합니다 .FOLDERSUB_FOLDER

-printf "d%h\0%T@ %p\0"발견된 각 SUBFOLDER메시지를 다음과 같이 인쇄합니다.

d FOLDER \0 last modif time in second since EPOCH [space] SUBFOLDER \0등.

\0이름의 일부가 될 수 없으므로 이는 완벽한 구분 기호입니다.

awk -v RS="\0"\0기록 구분자로 고려 중입니다 .

/^d/ {directoryname=substr($0,2)}: regex레코드가 ;로 시작하는 d경우에 해당됩니다 . directoryname변수는 생성을 통해 문자 FOLDER뒤에 오는 모든 문자로 구성된 이름으로 업데이트됩니다 .dprintf

/^[0-9]/: regex레코드가 숫자로 시작하는 경우에 해당됩니다. 구성에 따르면 printf현재 레코드의 첫 번째 필드( $1예: ̀ [space]문자까지의 모든 문자)에는 마지막 수정 시간이 포함됩니다.

&& (!lmtimes[directoryname] || lmtimes[directoryname] < $1):연대연관 배열([키, 값] 쌍의 맵)입니다. SUBFOLDER현재 FOLDER( directoryname) 현재 최근 마지막 수정 시간을 저장하는 데 사용됩니다 . true마지막 수정 시간이 저장되지 않았 directoryname거나, 마지막 수정 시간이 현재 시간 이전에 저장되었는지 여부를 표현합니다 SUBFOLDER.

다음 표현식이 true인 경우 마지막 수정 시간과 이름이 FOLDER키를 사용하여 directoryname저장 됩니다.연대그리고실시간 도메인 이름 시스템, 각각.

END {for (...: 모든 기록이 구문 분석되면 SUBFOLDER마지막으로 수정된 시간과 함께 각 이름을 인쇄합니다.

----

기록의 경우 이 명령은 각 디렉터리에 대해 마지막으로 수정된 파일 이름을 나열합니다.

 find "$(pwd)" -depth -type f -printf "d%h\0%T@ %p\0" | awk -v RS="\0" '
  /^d/ {
    directoryname=substr($0,2);
  }
  /^[0-9]/ {
    if (!lmtimes[directoryname] || lmtimes[directoryname] < $1) {
      lmtimes[directoryname]=$1;
      lmtimefns[directoryname]=substr($0,index($0," ")+1);
    }
  }
  END {
    for (directoryname in lmtimefns) {
      print lmtimefns[directoryname];
    }
  }'

관련 정보