파일이 생성된 시간+날짜별로 grep 출력을 정렬하는 방법은 무엇입니까?

파일이 생성된 시간+날짜별로 grep 출력을 정렬하는 방법은 무엇입니까?

이 명령을 실행하면

grep _rlnAveragePmax *model*

나는 다음과 같은 결과를 얻습니다.

run_ct6_it006_model.star:_rlnAveragePmax                             0.153500
run_ct6_it007_model.star:_rlnAveragePmax                             0.096772
run_it000_model.star:_rlnAveragePmax                             0.000000
run_it001_model.star:_rlnAveragePmax                             0.008995
run_it002_model.star:_rlnAveragePmax                         2.517429e-04
run_it003_model.star:_rlnAveragePmax                             0.003727
run_it004_model.star:_rlnAveragePmax                             0.056681
run_it005_model.star:_rlnAveragePmax                             0.109754
run_it006_model.star:_rlnAveragePmax                             0.153500

그러나 위의 출력은 알파벳순으로 정렬됩니다. 생성 시간 + 날짜를 기준으로 정렬하면 출력은 다음과 같아야 합니다.

run_it000_model.star:_rlnAveragePmax                             0.000000
run_it001_model.star:_rlnAveragePmax                             0.008995
run_it002_model.star:_rlnAveragePmax                         2.517429e-04
run_it003_model.star:_rlnAveragePmax                             0.003727
run_it004_model.star:_rlnAveragePmax                             0.056681
run_it005_model.star:_rlnAveragePmax                             0.109754
run_it006_model.star:_rlnAveragePmax                             0.153500
run_ct6_it006_model.star:_rlnAveragePmax                             0.153500
run_ct6_it007_model.star:_rlnAveragePmax                             0.096772

생성 시간 + 날짜별로 출력을 정렬하려면 grep 명령으로 무엇을 해야 합니까?

답변1

macOS를 실행하지 않는 한 파일 생성 날짜는 저장되지 않습니다. 파일을 편집하면 일반적으로 이전 버전을 대체하는 새 파일이 생성되기 때문에 개념은 잘 정의되어 있지 않습니다. 기록된 날짜는 파일이 마지막으로 수정된 날짜입니다(초기 생성 및 후속 편집 포함).

수정 시간별로 파일을 정렬하는 가장 쉬운 방법은 다음을 실행하는 것입니다.다루기 힘든(bash, ksh 또는 Fish와 같이 덜 강력한 다른 쉘과 반대) zsh에서는 사용할 수 있습니다글로벌 예선예를 들어 Om수정 시간을 기준으로 파일을 정렬합니다(가장 오래된 것부터, Om가장 어린 것부터).

grep _rlnAveragePmax *model*(Om)

grep파일이 명령줄에 지정된 순서대로 탐색되므로 원하는 결과를 얻을 수 있습니다 .

답변2

먼저 시간 정렬된 ls를 수행한 다음 -H 플래그를 사용하여 xargs를 통해 stdout을 grep으로 파이프하여 파일 이름을 포함합니다(이 작업은 하나의 파일에 대해서만 수행하므로 기본적으로 파일 이름은 포함하지 않습니다).

ls 이후의 첫 번째 grep에서는 디렉터리가 제외됩니다(제공한 예에서는 이것이 재귀 검색이 아니라고 생각하세요). ls 뒤의 두 번째 grep, 파일 이름 필터링(xargs 제외)

ls -tpQ --quoting-style=shell | grep -v / | grep model | xargs -i grep -H _rlnAveragePmax {}

와일드카드에 대한 귀중한 설명 후 업데이트: 파일 이름에 이상한 문자가 포함될 수 있는 모든 경우를 설명하기 위해 inode 번호가 ls에서 추출되고 inode 번호 일치 및 grep 명령을 위해 "find"로 파이프됩니다. xargs 명령이 두 {}를 구별할 수 없기 때문에 xargs는 "while read line"으로 대체되었습니다.

심볼릭 링크를 따르고 디렉터리 등은 포함하지 않고 파일만 포함합니다. 이 경우 최대 깊이 매개변수는 중복되지만(파일만 남겨두고) 매개변수를 변경하여 재귀 검색도 가능하도록 포함했습니다.

ls -ti | cut -d " " -f1 | while read line; do find -L . -maxdepth 1 -type f -inum $line -exec grep -H xxx {} \; ; done

관련 정보