端末から欠落しているファイルを順番に一覧表示しようとしています。これには多くの答えがありますが、私の状況に適応するほど一般的ではありません。したがって、十分に一般的で、より多くの人に適した回答ができる場合は、そうしてください。
欠落しているファイルを一覧表示していますが、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
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]
一致するかどうかを判断するファイルが1つしかないため、最初の一致するファイルのみが選択されます。$^array
: 配列要素の中括弧の拡張${array1:|array2}
:配列減算print -l
:1行ずつ印刷
答え4
あなたは試すことができます:
ls *{369..422}*.avi