![항목 수에 따라 ls 명령이 다르게 동작하도록 만들기](https://linux55.com/image/86258/%ED%95%AD%EB%AA%A9%20%EC%88%98%EC%97%90%20%EB%94%B0%EB%9D%BC%20ls%20%EB%AA%85%EB%A0%B9%EC%9D%B4%20%EB%8B%A4%EB%A5%B4%EA%B2%8C%20%EB%8F%99%EC%9E%91%ED%95%98%EB%8F%84%EB%A1%9D%20%EB%A7%8C%EB%93%A4%EA%B8%B0.png)
나열될 수 있는 디렉토리 항목 수에 따라 ls 명령이 다르게 작동하도록 할 수 있습니까?
방금 사용하는 경우 ls
(수정 옵션은 없지만 디렉터리나 필터를 지정할 수 있음) 다음을 원합니다.
-l
항목 수가 10개 이하인 경우 긴 목록 형식을 사용합니다.- 처음 50개 항목만 표시하고 경고를 출력합니다.
x more entries
가능합니까? 어떻게 해야 하나요?
사용자 정의 스크립트를 사용하여 사용자 정의 명령 으로 전환 하고 싶지는 않습니다. 사용자 정의 스크립트나 래퍼를 사용할 수 있지만 여전히 ls
이를 수행하고 전체 기능을 유지하는 데 사용하고 싶습니다 . 즉, 단순히 스크립트/래퍼를 my-custom-ls
호출하는 것이 아닙니다.ls
답변1
사용자 정의 스크립트 명령/래퍼 함수가 필요하지 않은 경우 사용자 정의 바이너리 명령이 필요합니다. GNU ls
소스 코드는 다른 구현과 마찬가지로 사용 가능합니다.
자신만의 패치 버전을 생성 ls
하면 됩니다.
이 동작 변경으로 인해 POSIX 규정 준수가 중단됩니다.
편집(수정된 질문에 따라):
ls() {
if [ $(command ls "$@" | wc -l) -gt 10 ]; then
command ls "$@" | head -50
else
command ls -l "$@"
fi
}
남은 항목 수를 표시하는 향상된 버전:
ls() {
[ ! -t 1 ] && { command ls "$@" ; return ; }
r=$(command ls "$@")
lines=$(printf "%s" "$r" | wc -l)
if [ $lines -gt 10 ]; then
printf "%s" "$r" | head -50
if [ $lines -gt 50 ]; then
printf "%d more entries\n" $((lines - 50))
fi
else
command ls -l "$@"
fi
}
답변2
ls(1)
인수를 계산하고 올바른 인수로 호출하는 고유한 스크립트(예: Python)를 생성하고 more(1)
필요에 따라 페이지를 매깁니다(출력이 tty로 이동하는 경우).
답변3
ls 자체를 재정의할 수는 없지만 "ls2"와 함께 이 함수를 사용할 수 있습니다.
ls2 () {
num_of_files=`ls | grep "\/$" | wc -l`
if [ "$num_of_files" -gt "10" ]; then
ls | less
else
ls -l
fi
}
grep을 사용하여 디렉터리를 찾은 다음 wc(줄 수 옵션이 있는 unix 단어 개수 함수)를 사용하여 디렉터리 수를 계산하는 사용자 정의 명령 ls2를 만듭니다. "10" 비교에서 파일 수를 변경할 수 있습니다. ls -l
및/또는 명령을 변경하여 ls -a
실제로 수행되는 작업을 변경할 수 있습니다.
Bash 함수를 처음 사용하는 경우 - 코드를 파일에 넣은 다음 chmod +x
파일을 실행 가능하게 만든 다음 파일을 실행하고 . the_filename
함수를 사용하십시오 .ls2
영구적인 해결 방법을 찾으려면 파일에 기능을 추가하고 파일을 다루기 어렵게 만들지 않고도 한 곳에서 더 많은 기능을 추가할 수 있도록 파일에서 파생된 파일을 .bashrc
만드는 것을 고려하십시오 ..bashrc
.bashrc
항목을 한 번 이상 표시할 수 없습니다.
답변4
이것이 문제에 대한 나의 설명입니다. 배열을 사용하기 때문에 bash에만 해당됩니다. 이는 호출된 함수를 정의합니다 (따라서 실행 방식을 지우려면 ls
실행해야 합니다 ). 이 함수는 주어진 인수의 배열(또는 인수가 제공되지 않은 경우 현재 디렉토리의 내용 배열)을 생성합니다. 그런 다음 사용할 플래그를 결정하기 위해 이러한 요소를 계산합니다(10보다 작으면 를 사용하고 , 그렇지 않으면 ). 파일이 50개보다 많으면 처음 50개만 표시되고 메시지가 표시됩니다. 또한 출력이 화면에 출력되지 않을 때 함수가 더 정상적으로 작동하도록 하기 위해 Kevin/jlliagre의 아이디어를 뻔뻔하게 복사했습니다 .unalias ls
ls
ls
ls -ld
ls -d
ls
이는 플래그가 real 에 전달되는 것을 허용하지 않으며 ls
특별한 -r
주의 -a
가 필요합니다.
function ls {
_ls_longlimit=10
_ls_cutoff=50
declare -a _ls_files
[ ! -t 1 ] && { command ls "$@"; return; }
# TODO: skip past any "-rtxyz" options
if [ $# -eq 0 ]
then
_ls_files=(*)
else
for a in "$@"
do
if [ -d "$a" ]
then
# add "${a}/*" to array
_ls_files+=("${a}"/*)
else
# add $a to array
_ls_files+=("$a")
fi
done
fi
if [ ${#_ls_files[@]} -le $_ls_longlimit ]
then
command ls -ld "${_ls_files[@]}"
else
# -1 because arrays are 0-based
command ls -d "${_ls_files[@]:0:_ls_cutoff - 1}"
fi
if [ ${#_ls_files[@]} -gt $_ls_cutoff ]
then
echo $((${#_ls_files[@]} - _ls_cutoff)) more entries
fi
}