동일한 이름을 가진 포함된 파일의 마지막 수정 날짜/시간을 기준으로 디렉토리 정렬

동일한 이름을 가진 포함된 파일의 마지막 수정 날짜/시간을 기준으로 디렉토리 정렬

grep등 을 사용하여 find동일한 이름(예:)을 가진 파일의 마지막 수정 날짜를 기준으로 file.php디렉토리 목록을 정렬할 수 있습니까? 예를 들어:

domain1/file.php (last modified 20-Jan-2014 00:00)
domain2/file.php (last modified 22-Jan-2014 00:00)
domain3/file.php (last modified 24-Jan-2014 00:00)
domain4/file.php (last modified 23-Jan-2014 00:00)

각 디렉터리는 동일한 파일 이름을 갖습니다(예: file.php).

결과는 다음과 같습니다.

domain3/ (last modified 24-Jan-2014 00:00)
domain4/ (last modified 23-Jan-2014 00:00)
domain2/ (last modified 22-Jan-2014 00:00)
domain1/ (last modified 21-Jan-2014 00:00)

답변1

Vivian이 제안한 것처럼 -t옵션은 ls수정 시간을 기준으로 파일을 정렬하도록 지시합니다(기본적으로 가장 최근 항목이 먼저, 추가된 경우 그 반대 -r). 이것은 (적어도 내 경험으로는) 디렉토리의 파일을 정렬하는 데 가장 일반적으로 사용되지만 명령줄의 파일 목록에도 적용할 수 있습니다. 와일드카드("glob")는 명령줄에 파일 목록을 생성합니다. 그래서 당신이 말한다면

ls -t */file.php

그것은 나열됩니다

domain3/file.php  domain4/file.php  domain2/file.php  domain1/file.php

그러나 -1(대시 1) 옵션을 추가하거나 다른 항목에 연결하면 한 줄에 하나씩 나열됩니다. 그래서 당신이 원하는 명령은

ls -t */file.php | sed 's|/file.php||'

이것은 일반적인 대체품이지만 구분 기호로 사용됩니다.s/old_string/replacement_string/sed|old_string/비어 있는 a가 포함되어 있습니다 .replacement_string. (즉, 출력에서 ​​파일 이름과 /그 앞에 오는 내용을 제거합니다.) 물론, 후행 디렉터리 이름을 원하면 또는 를 수행하면 됩니다./file.phpls/sed 's|file.php||'sed 's/file.php//'

필요한 경우 -l(소문자 L) 옵션을 추가하여 ls 수정 날짜/시간을 포함한 긴 목록을 가져옵니다. 그런 다음 sed관련 없는 정보(예: 파일 모드, 소유자 및 크기)를 제거하고 필요한 경우 날짜/시간을 디렉터리 이름 뒤로 이동하도록 명령을 향상할 수 있습니다 .

그러면 다음 디렉터리가 표시됩니다.존재하다현재 디렉터리, 그리고 그 디렉터리만. (이것은 질문이 요구하는 것 같습니다.) 다른 디렉토리에 대한 단일 수준 검색은 사소한 변경입니다.

ls -t /path/to/tld/*/file.php | sed 's|/file.php||'

현재 디렉터리(또는 다른 최상위 디렉터리) 아래의 전체 디렉터리 트리를 (재귀적으로) 검색하는 것은 약간 까다롭습니다. 명령을 입력하다

shopt -s globstar

그런 다음 *위 명령 중 하나에서 별표( )를 두 개의 별표( **)로 바꿉니다. 예를 들어 다음과 같습니다.

ls -t **/file.php | sed 's|/file.php||'

답변2

네, 가능합니다.

그러면 지난 60분 동안 수정된 파일이 제공됩니다.

$ find /domain -type f -mmin -60

또는 수정 시간별로 정렬된 파일을 제공합니다.

$ find /domain -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r

편집 #1

파일 확장자가 ".php"인 경우 다음을 추가하세요.

-name '*.php'

내가 찾은이것확인해 보시면 좋을 것 같습니다.

편집 #2

음, 마지막 편집으로 인해 상황이 좀 더 어려워졌습니다. 하지만 마지막으로 수정된 디렉토리를 사용할 수 있습니다 ls -t. 시간별로 정렬하려면 ls -clRt이를 사용할 수 있으며 그 후에 파일을 검사할 수 있지만 특정 명령을 사용하여 원하는 것이 무엇인지 잘 모르겠습니다. 유사한 스크립트(Bash 또는 Perl)를 사용하여 가능합니다.

답변3

이는 디렉터리 이름에 뒤에 오는 /를 생략한다는 점을 제외하면 원하는 것과 거의 정확히 일치합니다.

find . -maxdepth 2 -name file1.php -printf '%T@ %h (last modified %Td/%Tm/%TY %Tk:%TM)\n' \
| sort -k 1n | sed 's/^[^ ]* .\///'

신용이 필요한 신용. 이것은 다음에서 적응되었습니다.셰르크의답변여기.

편집: 내 %A는 모두 %T여야 합니다.

답변4

그리고 zsh:

setopt extendedglob
print -rl -- **/file.php(.om:h)

.om선택한 파일을 정렬 mtime하고 :h후행 경로 부분을 제거합니다. s도
나열하려면 mtime다음을 사용할 수 있습니다 zstat.

zmodload zsh/stat
for f (**/file.php(.om))
printf '%s %s\t%s\n' $(zstat -F '%d-%b-%Y %T' +mtime -- $f) ${f:h}

관련 정보