여러 디렉터리에 대한 마지막 n개의 최신 파일을 찾는 방법을 찾으려고 합니다.
문제는 디렉토리가 구조화되어 있지만 실제로는 계층적으로 배치되지 않고 특정 이름이 있다는 것입니다. 예:
./sensor
-./motion
--./2dMotion
---./saved
----./<name>.csv
---./processed
----./<name>.csv
--./3dMotion
---./saved
---./processed
-./temp
--./saved
---./<name>.csv
--./processed
내 문제는 다음과 같습니다. find 명령에서 -regex 옵션을 사용할 수 있지만 이는 최신 파일을 필터링하기 위해 추가 검색을 실행한 후에만 최신 파일을 제공하지만 센서의 작동 방식에 관계없이 최신 파일에 대해서만 작동합니다. 사용 .
내가 달성하고 싶은 것은 타임스탬프를 기반으로 최신 n개 파일을 표시하는 출력을 만드는 것입니다.
가능한 한 쉽게 이 작업을 수행할 수 있는 방법은 무엇입니까?
답변1
.csv
GNU 시스템의 모든 디렉토리에 있는 10개의 최신 일반 파일 의 경우 :saved
LC_ALL=C find . -type f -regex '.*/saved/[^/]*\.csv' -printf '%T@:%p\0' |
sort -rnz |
awk -v RS='\0' -F/ '{sub(/[^:]*:/, ""); file = $0; NF--}
++n[$0] <= 10 {print file}'
(파일은 최신 것부터 오래된 것 순으로 나열됩니다.)
를 사용하면 zsh
다음 작업도 수행할 수 있습니다.
for dir (**/saved(NDF)) print -rC1 -- $dir/*.csv(ND.om[1,10])
답변2
find . -type d -exec bash -c 'echo "next dir: ${1}" ; ls -lt "$1" |
grep ^- |
head -n 5' bash {} \;
전체 트리에서 가장 최근의 것
전체 트리에서 최신 파일을 제공하므로 이는 답이 아니지만 어쨌든 도움이 될 수 있습니다.
find . -type f -printf "%T@ %p\n" |
sort -nr |
awk 'NR==6 { exit; } {$1=""; print; }'
답변3
ls -lt |grep '^-' |head -n N
루프 내에서 사용하십시오.
for DIR in /path/to/*; do
if [ -d "$DIR"]; then
ls -lt "$DIR/*.csv" |grep '^-' |head -n N
fi
done
N은 최신 파일 수인 경우 각 디렉터리의 결과에 표시할 파일 수를 지정할 수 있습니다. 바라보다만 LS.