find -exec ls의 출력 정렬

find -exec ls의 출력 정렬

파일 이름별로 출력을 알파벳순으로 정렬할 수 있습니까 find … -exec ls -ls ;?

이것은 내 cron 명령입니다.

find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;

이 명령은 대부분의 경우에 잘 작동합니다. 그러나 결과는 의미 있는 순서로 정렬되지 않습니다. 파일 이름 필드를 기준으로 정렬하면 매우 도움이 될 것입니다.

답변1

귀하의 파일 이름에 개행 문자가 포함되어 있지 않다고 가정합니다.

find /home/setefgge/public_html -type f -ctime -1 -exec ls -nls {} + | sort -k 10

호출을 일괄 처리하는 +대신 ;종료 작업을 사용하면 작업 속도가 빨라질 수 있습니다 . 명령을 사용하여 파이프라인을 정렬할 수 있습니다 . 10번째 필드부터 정렬을 시작하도록 지시합니다(처음 9개 필드는 메타데이터입니다: 블록, 권한, 링크 수, 사용자, 그룹, 크기 및 3개의 날짜/시간 필드). 이 옵션은 사용자 또는 그룹 이름에 공백이 포함될 위험을 방지하기 위해 사용자 및 그룹에 숫자 값을 사용함을 나타냅니다 .-execlssort-nls

또는 zsh를 사용하면 다음을 사용하여 모든 이름에 대한 가정을 제거할 수 있습니다.글로벌 예선파일 수집 및 정렬zargsls명령줄이 너무 길면 여러 번 실행하세요. 재정렬을 방지하려면 GNU ls(특히 해당 옵션) 가 필요합니다 (대안은 zsh를 사용하여 시뮬레이션하는 것 입니다)-flslszstat).

autoload -U zargs
zargs -- /home/setefgge/public_html/**/*(.c-2) -- ls -lnsf

답변2

정렬을 통해 찾기 결과를 전달한 다음 각 행에 대해 ls를 수행하는 것은 어떨까요?

find . -type f -ctime -1 | sort | while IFS= read -r filename; do ls -ls "$filename"; done

답변3

POSIX는 ong 목록의 날짜에 대해 다음과 같이 말합니다 ls -l.

<date and time>필드에는 파일이 마지막으로 수정된 날짜와 시간 스탬프가 포함되어야 합니다. POSIX 로케일에서 이 필드는 다음 날짜 명령의 출력과 동일해야 합니다.

date "+%b %e %H:%M"

...지난 6개월 이내에 파일이 수정된 경우 또는:

date "+%b %e %Y"

이를 염두에 두고 파일 이름에 줄 바꿈이 있는 경우 POSIX 지정 옵션을 사용하여 올바르게 일치하는지 확인하면 ls -q결과에 대한 정규식을 준비하는 것이 상대적으로 쉽고 전혀 필요하지 않습니다.lsfind

d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"

###OUTPUT###
Jul  5 Jul  4

grep이렇게 하려면 오늘 또는 어제 날짜를 나타내는 문자열이 포함된 행만 반환합니다. 다음 명령은 여기에 약간을 추가합니다.

ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"

ls옵션은 다음과 같습니다:

  1. -a다음으로 시작하는 파일을 포함하여 디렉터리의 모든 파일을 반환합니다..dot
  2. -l긴 목록
  3. -R모든 하위 디렉터리를 재귀적으로 나열
  4. -c접속 시간 대신 수정 시간 표시
  5. -q?인쇄할 수 없는 문자나 파일 이름의 ab 문자 대신 쉘 글로브를 반환합니다.\t

|pipe이 결과는 일치하는 파일 에만 전달됩니다 sed.

  1. 경로 이름 앞의 빈 줄과 다음 줄
  2. 다음으로 시작하는 줄- (즉, d디렉토리에서는 작동하지 않습니다)여기에는 귀하의 date.
  3. 그러나 이름이 지정된 디렉토리에 실제로 필터링한 파일이 포함되어 있지 않으면 경로 이름 행을 인쇄하지 않습니다.

출력은 다음과 같습니다.

ls -alRcq --color=always | 
sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"

###OUTPUT###
.:
-rw------- 1 mikeserv mikeserv   2086 Jul  4 10:52 .bash_history
-rw------- 1 mikeserv mikeserv   2657 Jul  4 15:20 .lesshst
-rw-r--r-- 1 mikeserv mikeserv    681 Jul  5 05:18 .zdirs
-rw------- 1 mikeserv mikeserv 750583 Jul  5 08:28 .zsh_history
-rw-r--r-- 1 mikeserv mikeserv    166 Jul  4 23:02 Terminology.log
-rw-r--r-- 1 mikeserv mikeserv 433568 Jul  4 13:34 shot-2014-06-22_17-10-16.jpg
-rw-r--r-- 1 mikeserv mikeserv 445192 Jul  4 13:34 shot-2014-06-22_17-11-06.jpg

./.cache/efreet:
-rw------- 1 mikeserv mikeserv  37325 Jul  4 22:51 desktop_localhost_C.eet
-rw------- 1 mikeserv mikeserv  37325 Jul  4 23:30 desktop_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv  24090 Jul  4 22:51 desktop_util_localhost_C.eet
-rw------- 1 mikeserv mikeserv  24090 Jul  4 23:30 desktop_util_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv  16037 Jul  4 23:30 icon_themes_localhost.eet
-rw------- 1 mikeserv mikeserv   3117 Jul  4 23:30 icons___efreet_fallback_localhost.eet
-rw------- 1 mikeserv mikeserv 768039 Jul  4 23:30 icons_gnome_localhost.eet
-rw------- 1 mikeserv mikeserv  18589 Jul  4 23:30 icons_hicolor_localhost.eet

./.config:
-rw-r--r-- 1 mikeserv mikeserv   30 Jul  4 19:10 pavucontrol.ini

./.config/chrome:
-rw-r--r-- 1 mikeserv mikeserv 94332179 Jul  4 13:36 conf.tar.lz4.bak

예, 심지어 작동합니다 LS_COLORS. 물론 이것은 귀하에게 낮은 우선순위일 수 있지만 cron옵션은 열려 있습니다.

그럼에도 불구하고 이는 다른 가능한 솔루션에 비해 몇 가지 중요한 이점을 제공합니다.

  1. 첫째, find+ ls에는 여러 호출이 포함됩니다. 이는 하나의 ls프로세스만 포함하므로 모든 것을 안정적으로 정렬합니다(기본적으로 그렇게 함). 따라서 sort보조적인 역할도 합니다.

  2. find관련되어 있고 수행 중인 모든 sort솔루션ls모두두 번 일했습니다. 모든 경로 이름과 모든 파일을 구문 분석 ls합니다 . 그리고 모든 결과가 정렬됩니다. 하나만 사용하는 것이 가장 좋습니다 .findstatlssortls

  3. 물론 이 답변에는 and 부분이 있습니다 date. sed주목해야 할 중요한 점은 어려운 부분을 수행하고 정규식을 먼저 한 번만 얻은 다음 결과를 얻고, 결과를 얻고, 결과를 정렬하고 정렬하는 대신 단일 결과 목록을 다듬는다는 것입니다. 결과를 정렬합니다.

  4. 다른 솔루션처럼 개행 문자가 포함된 파일 이름은 손상되지 않습니다. 이 솔루션에는 다음에 설명할 고유한 주의 사항이 있지만 이는 사소하고 관리하기 쉽습니다. 내 생각에는 이것이 가장 강력한 솔루션이다.

위 명령으로 인해 문제가 발생할 수 있는 두 가지 상황이 있습니다. 첫 번째는 ?파일 이름에 glob을 포함합니다. 이미 여기에 제시된 다른 솔루션보다 더 강력한 솔루션이고 a가 발생할 가능성은 ?그 자체로는 충분히 작지만 여러 파일 이름과 일치할 수 있는 이러한 glob을 확인할 수 있습니다. 보다이것이 주제에 대한 추가 정보.

date또 다른 가능성은 거짓 긍정과 관련이 있습니다. 예를 들어, 검색 중인 문자열과 실제로 일치하는 파일 이름이 있지만 grep특정 날짜에 실제로 수정되지 않은 경우입니다. 이것이 문제가 아니라고 생각합니다. 하지만 문제가 된다면 문의해 주세요. 이 문제를 처리할 수 있도록 정규 표현식을 더 구체적으로 만드는 데 도움을 드릴 수 있습니다.

답변4

실제로 find, xargs 및 ls를 조합하여 사용할 수 있습니다.

다음은 명령의 예입니다.find . -type f -print0 | xargs -0 ls -lt

  • find현재 디렉터리의 모든 파일이 반복적으로 검색됩니다.
  • lsxargs는 한 번의 호출로 이 파일 목록을 명령에 전달합니다( 파일 수 find보다 반환된 파일 수가 더 적은 경우 ).ARG_MAX
  • ls -lt이 파일은 시간별로 정렬되고 출력 형식이 지정됩니다.

시스템을 검색하려면 ARG_MAX다음을 입력하세요.

$ getconf ARG_MAX
> 2621440

관련 정보