와일드카드를 처리할 수 있는 "ls"에 대한 대안이 있습니까?

와일드카드를 처리할 수 있는 "ls"에 대한 대안이 있습니까?

나는 방금 ls가 와일드카드를 처리할 수 없다는 것을 배웠습니다( ls '*'작동하지 않음). 따라서 쉘은 ls를 호출하기 전에 이 작업을 수행합니다. 따라서 20년 동안 UNIX를 사용해 본 사람에게는 ls의 동작이 논리적이라고 간주될 수 있지만 나에게는 그렇지 않으며 나는 ls를 좋아하지 않습니다.

파일과 디렉터리를 검색하는 디렉터리 명령을 원합니다그 다음에와일드카드 필터를 적용합니다. 이러한 방식으로 a는 ls cr*"cron.daily" 디렉토리의 파일을 나열하지 않습니다.

나도 거기 있는 걸 알아 ls -d, 내가 하나 만들었어 alias lx=ls -lartd. 그러나 나는 ls -d어떤 은밀한 이유로 어떤 논쟁도 하지 않는 것이 효과가 없다는 것을 깨달았습니다.

설치할 수 있는 대안이 있습니까?

답변1

을 사용할 수 있으며 find옵션이 있습니다(많은 플랫폼에서) -ls. 그래서 당신은 할 수 있습니다

find . -maxdepth 1  -name '*' -ls

하지만 기억하기 어렵다면 개선점을 ls -d찾지 못할 수도 있습니다 find.

답변2

당신이 원하는 것이 자신을 나열하는 cmd명령 이라면 이것이 바로 그것입니다 . 입력이 너무 많으면 다음을 정의할 수 있습니다.cmd cr*cron.dailyls -d별명. 예를 들어 다음 줄을 다음 줄에 입력하세요 ~/.bashrc.

alias l='ls -d'

그런 다음 Run은 자신에 대한 정보를 l cr*표시 하고 디렉터리의 내용 (패턴과 일치하는 다른 디렉터리 및 패턴과 일치하는 디렉터리가 아닌 다른 디렉터리)을 나열합니다.cron.dailyls cr*cron.daily


ls -d실제로 작동한다. 그것은 당신이 요청한 것과 정확히 일치합니다: 현재 디렉토리 자체를 나열합니다. 이것은 그다지 유용하지 않을 수도 있습니다. ls -ld일종의, 그러나 실제로는 그렇지 않습니다 ls -d. 그러나 컴퓨터는 사용자가 지시한 대로 수행하며, 사용자가 원하는 것이 무엇인지 파악하기 위해 사용자의 마음을 읽지는 않습니다.

ls -d매개 변수 없이 현재 디렉터리 목록을 얻는다는 점을 제외하고 효과를 얻으려면 함수를 정의할 수 있습니다.

l () {
  if [ $# -eq 0 ]; then
    ls -l
  else
    ls -ld "$@"
  fi
}

그런 다음 디렉터리인 경우에도 l cr*이름이 로 시작하는 파일을 나열합니다 . 콘텐츠 자체가 아닌 콘텐츠를 사용하거나 cr나열 할 수 l cron.daily있습니다 . 대신 현재 디렉터리의 파일을 나열합니다.cron.dailyls cron.dailyl cron.daily/*l

위의 함수를 통해 플래그가 l -a전달됩니다 -d. 이를 원하지 않으면 파일 이름 인수가 있는지 확인할 때 함수 삭제 옵션을 사용할 수 있습니다.

l () {
  local a
  a=("$@")
  while [[ $1 = -* ]]; do shift; done
  if [ $# -eq 0 ]; then
    ls -l "${a[@]}"
  else
    ls -ld "${a[@]}"
  fi
}

원하는 것이 하위 디렉토리에 있는 파일을 나열 하지만 자체적으로 나열하는 cmd명령 이라면 이는 bash에서는 불가능합니다. 명령이 실행되면 쉘은 와일드카드를 확장하므로 명령은 사용자가 와일드카드를 사용했는지 여부를 알 수 없습니다.cmd cron.dailycron.dailycmd cd*cron.daily

이 작업은 다음에서 수행할 수 있습니다.다루기 힘든, zsh에서는 특정 명령에 대해 와일드카드 확장을 비활성화할 수 있기 때문입니다. Zsh는 대부분의 시스템에서 기본 셸이 아니지만 패키지를 설치하기만 하면 됩니다. zsh에서는 다음을 사용하여 별칭을 정의할 수 있습니다.noglob접두사:

alias l='noglob list_files_or_directory_contents'

그런 다음 기능을 정의해야 합니다 list_files_or_directory_content. 요구 사항이 일반적이지 않으므로 아직 존재하지 않을 수도 있습니다. 나는 이것이 필요한 기능을 수행하는 기능이라고 생각합니다. 직접 지정된 디렉터리의 내용을 나열하고, 와일드카드 확장에서 나온 경우 디렉터리 자체를 나열합니다.

list_files_or_directory_contents () {
  local arg matches
  setopt local_options no_csh_null_glob no_null_glob no_nomatch no_glob_subst no_sh_word_split
  if (($#==0)); then
    # No arguments: list the directory itself
    ls -l
  else
    for arg; do
      matches=($~arg)
      if [[ $#matches -eq 1 && $matches[1] == $arg ]]; then
        # Not a wildcard pattern: list the directory contents if it's a directory
        ls -l -- $arg
      else
        # Wildcard pattern: list the matches themselves, even the ones that are directories
        ls -ld -- $matches
      fi
    done
  fi
}

답변3

나는 이것이 당신이 원하는 것을 할 것이라고 생각합니다. 나는 이 접근 방식이 원하는 수의 유틸리티에 적용될 수 있다고 생각합니다. 하지만 아직 조정하지 않은 새로운 시스템으로 이동할 때 "손가락 습관"이 깨질 수 있기 때문에 이 방법은 정말 권장하지 않습니다.

ls() { [[ 0 == $# ]] && set -- *; /bin/ls -d "$@"; }

확장하면 별칭이 다음 기능으로 대체됩니다.

lx() { [[ 0 == $# ]] && set -- *; /bin/ls -lartd "$@"; }

관련 정보