log1
에서 까지 의 파일이 많이 있습니다 log164
.
UNIX 터미널에서 디렉터리를 정렬하여 나열하려고 하는데 정렬 기능이 다음 형식만 제공합니다.
home:logs Home$ ls -1 | sort
log1.gz
log10.gz
log100.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz
...etc
내가 원하는 건
home:logs Home$ ls -1 | sort
log1.gz
log2.gz
log3.gz
log4.gz
log5.gz
log6.gz
log7.gz
...{more here}
log99.gz
log100.gz
log101.gz
log102.gz
...etc
이 작업을 수행하기 위해 무엇을 사용할 수 있는지에 대한 제안이 있습니까?
답변1
ls
이 특별한 경우에 내장된 GNU 기능을 사용하는 것은 어떨까요?
-v
— 텍스트에서 (버전) 번호의 자연스러운 순서
예를 들어:
ls -1v log*
답변2
GNU ls 사용(즉, Linux, Cygwin 또는 GNU ls가 특별히 설치된 기타 시스템에서):
ls -v
zsh에서:
echo *(n)
다른 쉘에서는:
echo log?.gz log??.gz log???.gz
각 파일 이름을 별도의 줄에 표시하려면 echo
로 바꾸십시오.printf '%s\n'
파일 메타데이터( )도 필요 ls -l
하고 GNU ls가 없는 경우 ls
사전순으로 보려는 각 파일 이름 또는 파일 이름 그룹에 대해 별도로 호출해야 합니다.
ls -ld log?.gz; ls -ld log??.gz; ls -ld log???.gz
이러한 어려움을 피하려면 파일 이름 앞에 0을 충분히 사용하여 사전 정렬이 보다 사용자 친화적이도록 하십시오( log001.gz
예:).
답변3
bash
중괄호는 {}
순서대로 나열됩니다.
for file in log{1..164}.gz; do
process "$file"
done
답변4
이 특별한 경우에는 ls -1v
의심할 여지 없이 솔루션이 최고이지만 sort
, 입력이 에서 나오지 않을 때도 작동하기 때문에 원래 질문에서와 마찬가지로 작동하는 솔루션도 갖는 것이 더 나을 것이라고 생각합니다 ls
. 이 경우 다음을 사용할 수 있습니다.
ls -1 | sort -n -k1.4
이 -n
옵션은 숫자로 정렬하고 -k 1.4
정렬 키를 첫 번째 필드(이 경우 전체 파일 이름)에 설정하도록 지시하며, 4번째 문자부터 시작하여 마지막 문자로 끝납니다.