ls에서 와일드카드를 사용하여 일련의 숫자에서 누락된 파일을 찾는 방법은 무엇입니까?

ls에서 와일드카드를 사용하여 일련의 숫자에서 누락된 파일을 찾는 방법은 무엇입니까?

터미널에서 누락된 파일을 순서대로 나열하려고 합니다. 여기에는 많은 답변이 있지만 내 상황에 적응할 만큼 일반적이지는 않습니다. 그러므로 충분히 일반적이고 더 많은 사람들에게 적합한 답변을 할 수 있다면 그렇게 하시기 바랍니다.

누락된 파일을 나열하고 있지만 ls {369..422}.avi >/dev/null*를 사용하여 .avi로 끝나는 파일과 일치시킬 수 없습니다. 어떻게 해야 하나요?

번호는 파일 끝이 아니라 중간에 있습니다. 그래서 나는 다음과 같은 것이 필요합니다*numbers*.avi

답변1

ls *{369..422}*.avi >/dev/null

이것은 먼저 다음과 같은 패턴을 생성합니다

*369*.avi
*370*.avi
*371*.avi
*372*.avi
*373*.avi
*374*.avi

중괄호를 통해 확장된 ls이러한 패턴은 실행되며, 현재 디렉터리의 이름으로 확장될 수 없는 각 패턴에 대해 오류 메시지를 제공합니다.

*또는 이름에 다음 내용이 포함된 파일이 없는 경우 :

for name in *{369..422}*.avi; do
    case "$name" in 
        '*'*) printf '"%s" not matched\n' "$name" ;;
    esac
done

이는 패턴이 현재 디렉터리의 이름과 일치하지 않으면 패턴이 확장되지 않은 상태로 유지된다는 사실에 의존합니다. 이는 누락된 파일을 구문 분석할 필요 없이 잠재적으로 유용한 작업을 수행할 수 있는 방법을 제공합니다 ls.

답변2

원한다면 *numbers*.avi다음과 같이 할 수 있습니다.

ls *[0-9]*.avi

해당 로케일 사이 및 로케일 내의 [0-9]모든 문자로 구성된 문자 클래스를 지정합니다. 모두 숫자여야 합니다. 따라서 0개 이상의 문자( )를 일치시킨 다음 숫자를 일치시키고 0개 이상의 문자( )를 다시 일치시키려고 합니다.09*[0-9]*

여러 숫자를 순서대로 입력해야 하는 경우 다음을 사용하세요.

ls *[0-9][0-9]*.avi

마지막으로, 번호순으로 파일이 있고 누락된 파일을 찾으려는 경우 작은 루프를 작성할 수도 있습니다.

for avi in {369..422}.avi; do [ -e "$avi" ] || echo "$avi missing"; done

답변3

*{369..422}*.avi파일과 일치하지 않는 패턴을 나열하려면 zsh다음을 수행할 수 있습니다.

for p (\*{369..422}\*.avi) () {(($#)) || echo $p} $~p(N[1])

또는 더 자세히:

for p (\*{369..422}\*.avi) () {
  if (($#)); then
    echo "$# file(s) matching $p"
  else
    echo >&2 No file matching $p
  fi
} $~p(N)

고정된 패턴(예: )을 따르는 파일의 경우 foo-123-bar.avi다음을 수행할 수도 있습니다.

expected=(foo-{369..422}-bar.avi)
actual=($^expected(N))
missing=(${expected:|actual})
print -l $missing

특정 기능 중 일부 zsh:

  • x{1..20}y중괄호 확장은 x1y, x2y....로 확장되었습니다. 이후 여러 다른 쉘에 의해 복사되었습니다.
  • for var (values) cmdfor:짧은 형태의 루프
  • () compound-command args:익명 함수다른 많은 언어와 마찬가지로.
  • $~p: 내용을 $p전역 변수로 처리합니다(다른 쉘에서는 기본적으로 이 작업을 수행하며 심지어 단어 분할도 수행합니다!).
  • (N[1]):glob 한정자, glob은 일치하는 파일이 없으면 인수 없이 확장됩니다. [1]일치 여부를 판단할 파일이 하나만 있으므로 첫 번째 일치하는 파일만 선택됩니다.
  • $^array: 배열 요소의 중괄호 확장
  • ${array1:|array2}:배열 빼기
  • print -l: 한 줄씩 인쇄

답변4

당신은 시도 할 수 있습니다: ls *{369..422}*.avi

관련 정보