안녕하세요. 저는 이 루프에서 가장 긴 파일 이름과 가장 짧은 파일 이름을 얻으려고 노력하고 있습니다. awk 파이프를 사용해 보았지만 작동하지 않습니다. 항상 파일 이름의 문자열 개수를 사용하여 모든 파일을 씁니다. 배열을 반복하고 가장 짧은 파일 이름과 가장 긴 인덱스를 기록하려면 해당 경로에서 가장 길고 가장 짧은 스크립트 파일 이름을 확인해야 합니다. dirs 배열에는 파일 이름만 정렬해야 하지만 출력은 다음과 같아야 합니다. 가장 긴 파일 이름 = 15자 /usr/sbin/update-info-dir
이제 작동합니다. 가장 긴 파일 이름 = 3자 /usr/sbin/ufw
최대 파일 이름 = 22자 /usr/sbin/update-ca-certificates
최대 파일 이름 = 15자 /usr/sbin/update-info-dir
가장 긴 파일 이름 = 16자 /usr/sbin/update-initramfs
가장 긴 파일 이름 = 13자 /usr/sbin/update-locale
가장 긴 파일 이름 = 11자 /usr/sbin/update-mime.... 그리고 아래와 같이 배열에 저장된 모든 파일을 검색합니다. 위와 동일한 경로를 가진 가장 긴 파일과 가장 짧은 파일만 표시하고 싶습니다.
답변1
이 글을 쓰는 시점에서는 스크립트에 대한 요구 사항이 상대적으로 불분명합니다.
배열을 사용해야 하고 파일 이름과 경로 길이를 기준으로 정렬해야 한다는 것을 알고 있습니다.
이 스크립틀릿은 정확히 그 일을 수행하지만, 귀하의 예를 보면 특별히 배열을 반복해야 하는지, 아니면 다른 방식으로 배열을 구성해야 하는지 100% 확신할 수 없습니다. 또한 귀하의 사용을 이해할 수 없으므로 $PATH
지금은 생략하겠습니다.
files=( $(find . -type f | awk '{ print length, $0 }' | sort -n -s | cut -d' ' -f2-) )
echo "shortest: ${files[0]}"
echo "longest: ${files[-1]}"
이 스크립틀릿에는 최소한 Bash 버전 4.2(배열의 음수 인덱싱용)가 필요합니다. 첫 번째 인수로 지정한 현재 디렉터리를 검색합니다 find
.
루프를 사용해야 하는 경우 단순히 배열을 정렬하는 대신 배열을 반복하면서 가장 짧은 인덱스와 가장 긴 인덱스를 기록할 수 있습니다. 이것이 요구 사항인지 여부는 불분명합니다. 배열을 반복하면서 이 작업을 수행하는 것은 별로 의미가 없으므로 꼭 필요한 경우가 아니면 권장하지 않습니다.
답변2
가장 짧은 항목 표시:
awk '{split($0,items,":");for (item in items){print length(items[item])" "items[item]}}'<<<"$PATH"|sort -nk1|head -n1
가장 긴 표시:
awk '{split($0,items,":");for (item in items){print length(items[item])" "items[item]}}'<<<"$PATH"|sort -nk1|tail -n1