![find -exec ls의 출력 정렬](https://linux55.com/image/39183/find%20-exec%20ls%EC%9D%98%20%EC%B6%9C%EB%A0%A5%20%EC%A0%95%EB%A0%AC.png)
파일 이름별로 출력을 알파벳순으로 정렬할 수 있습니까 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개의 날짜/시간 필드). 이 옵션은 사용자 또는 그룹 이름에 공백이 포함될 위험을 방지하기 위해 사용자 및 그룹에 숫자 값을 사용함을 나타냅니다 .-exec
ls
sort
-n
ls
또는 zsh를 사용하면 다음을 사용하여 모든 이름에 대한 가정을 제거할 수 있습니다.글로벌 예선파일 수집 및 정렬zargs
ls
명령줄이 너무 길면 여러 번 실행하세요. 재정렬을 방지하려면 GNU ls
(특히 해당 옵션) 가 필요합니다 (대안은 zsh를 사용하여 시뮬레이션하는 것 입니다)-f
ls
ls
zstat
).
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
결과에 대한 정규식을 준비하는 것이 상대적으로 쉽고 전혀 필요하지 않습니다.ls
find
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
옵션은 다음과 같습니다:
-a
다음으로 시작하는 파일을 포함하여 디렉터리의 모든 파일을 반환합니다..dot
-l
긴 목록-R
모든 하위 디렉터리를 재귀적으로 나열-c
접속 시간 대신 수정 시간 표시-q
?
인쇄할 수 없는 문자나 파일 이름의 ab 문자 대신 쉘 글로브를 반환합니다.\t
|pipe
이 결과는 일치하는 파일 에만 전달됩니다 sed
.
- 경로 이름 앞의 빈 줄과 다음 줄
- 다음으로 시작하는 줄
-
(즉,d
디렉토리에서는 작동하지 않습니다)여기에는 귀하의date
. - 그러나 이름이 지정된 디렉토리에 실제로 필터링한 파일이 포함되어 있지 않으면 경로 이름 행을 인쇄하지 않습니다.
출력은 다음과 같습니다.
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
옵션은 열려 있습니다.
그럼에도 불구하고 이는 다른 가능한 솔루션에 비해 몇 가지 중요한 이점을 제공합니다.
첫째,
find
+ls
에는 여러 호출이 포함됩니다. 이는 하나의ls
프로세스만 포함하므로 모든 것을 안정적으로 정렬합니다(기본적으로 그렇게 함). 따라서sort
보조적인 역할도 합니다.find
관련되어 있고 수행 중인 모든sort
솔루션ls
모두두 번 일했습니다. 모든 경로 이름과 모든 파일을 구문 분석ls
합니다 . 그리고 모든 결과가 정렬됩니다. 하나만 사용하는 것이 가장 좋습니다 .find
stat
ls
sort
ls
물론 이 답변에는 and 부분이 있습니다
date
.sed
주목해야 할 중요한 점은 어려운 부분을 수행하고 정규식을 먼저 한 번만 얻은 다음 결과를 얻고, 결과를 얻고, 결과를 정렬하고 정렬하는 대신 단일 결과 목록을 다듬는다는 것입니다. 결과를 정렬합니다.다른 솔루션처럼 개행 문자가 포함된 파일 이름은 손상되지 않습니다. 이 솔루션에는 다음에 설명할 고유한 주의 사항이 있지만 이는 사소하고 관리하기 쉽습니다. 내 생각에는 이것이 가장 강력한 솔루션이다.
위 명령으로 인해 문제가 발생할 수 있는 두 가지 상황이 있습니다. 첫 번째는 ?
파일 이름에 glob을 포함합니다. 이미 여기에 제시된 다른 솔루션보다 더 강력한 솔루션이고 a가 발생할 가능성은 ?
그 자체로는 충분히 작지만 여러 파일 이름과 일치할 수 있는 이러한 glob을 확인할 수 있습니다. 보다이것이 주제에 대한 추가 정보.
date
또 다른 가능성은 거짓 긍정과 관련이 있습니다. 예를 들어, 검색 중인 문자열과 실제로 일치하는 파일 이름이 있지만 grep
특정 날짜에 실제로 수정되지 않은 경우입니다. 이것이 문제가 아니라고 생각합니다. 하지만 문제가 된다면 문의해 주세요. 이 문제를 처리할 수 있도록 정규 표현식을 더 구체적으로 만드는 데 도움을 드릴 수 있습니다.
답변4
실제로 find, xargs 및 ls를 조합하여 사용할 수 있습니다.
다음은 명령의 예입니다.find . -type f -print0 | xargs -0 ls -lt
find
현재 디렉터리의 모든 파일이 반복적으로 검색됩니다.ls
xargs는 한 번의 호출로 이 파일 목록을 명령에 전달합니다( 파일 수find
보다 반환된 파일 수가 더 적은 경우 ).ARG_MAX
ls -lt
이 파일은 시간별로 정렬되고 출력 형식이 지정됩니다.
시스템을 검색하려면 ARG_MAX
다음을 입력하세요.
$ getconf ARG_MAX
> 2621440