터미널에서 누락된 파일을 순서대로 나열하려고 합니다. 여기에는 많은 답변이 있지만 내 상황에 적응할 만큼 일반적이지는 않습니다. 그러므로 충분히 일반적이고 더 많은 사람들에게 적합한 답변을 할 수 있다면 그렇게 하시기 바랍니다.
누락된 파일을 나열하고 있지만 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개 이상의 문자( )를 다시 일치시키려고 합니다.0
9
*
[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) cmd
for
:짧은 형태의 루프() compound-command args
:익명 함수다른 많은 언어와 마찬가지로.$~p
: 내용을$p
전역 변수로 처리합니다(다른 쉘에서는 기본적으로 이 작업을 수행하며 심지어 단어 분할도 수행합니다!).(N[1])
:glob 한정자, glob은 일치하는 파일이 없으면 인수 없이 확장됩니다.[1]
일치 여부를 판단할 파일이 하나만 있으므로 첫 번째 일치하는 파일만 선택됩니다.$^array
: 배열 요소의 중괄호 확장${array1:|array2}
:배열 빼기print -l
: 한 줄씩 인쇄
답변4
당신은 시도 할 수 있습니다:
ls *{369..422}*.avi