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]すべての文字で構成される文字クラスを指定します。すべて数字でなければなりません。したがって、ゼロ個以上の文字()を一致させてから数字を一致させ、ゼロ個以上の文字()を再一致させようとします。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中括弧拡張はx1yx2y....に拡張されました。以来、いくつかの異なるシェルによってコピーされました。
  • for var (values) cmdfor:短い形のループ
  • () compound-command args:匿名関数他の多くの言語と同様に。
  • $~p:内容を$pグローバル変数として扱います(他のシェルはデフォルトでこれを行い、さらに単語分割も行います!)。
  • (N[1]):glob修飾子、globは一致するファイルがなければ引数なしで拡張されます。[1]一致するかどうかを判断するファイルが1つしかないため、最初の一致するファイルのみが選択されます。
  • $^array: 配列要素の中括弧の拡張
  • ${array1:|array2}:配列減算
  • print -l:1行ずつ印刷

答え4

あなたは試すことができます: ls *{369..422}*.avi

関連情報