내 파일 구조는 다음과 같습니다
FOLDER/SUB_FOLDER/Text_File
나는 그것들 중 1,000개 이상을 가지고 있으며 FOLDER
, 각각은 적어도 FOLDER
2개의 서로 다른 것을 가지고 있습니다 .SUB_FOLDER
SUB_FOLDER
Text_File
나는 가장 많은 것의 목록을 만들기 위해 나 자신에게 도전하려고 노력하고 있습니다.최근의 Text_File
당 FOLDER/
(루트로)
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
두 번째 수준의 디렉터리만 선택합니다 .FOLDER
SUB_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
뒤에 오는 모든 문자로 구성된 이름으로 업데이트됩니다 .d
printf
/^[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];
}
}'