現在のフォルダーに含まれるすべてのファイル名を印刷する必要がある演習があります。これらのファイルには、文字の1つと少なくとも[a-k]
1回(それぞれ)が含まれています。おそらく(glob-style)を使用する必要があります。[m-p]
[1-9]
ls
質問する
8563 次
4 に答える
3
順序が重要な場合は、グロビングを使用できます。
$ ls *[a-k]*[m-p]*[1-9]*
ajunk404 am1 cn5
それ以外のgrep
場合は、グループごとに個別に:
ls | grep "[a-k]" | grep "[m-p]" | grep "[1-9]"
1ma
ajunk404
am1
cn5
m1a
注:本当にファイルを内部でls
使用したい場合は、ディレクトリを表示します:find
find . -maxdepth 1 -type f | grep "[a-k]" | grep "[m-p]" | grep "[1-9]"
于 2012-12-28T13:00:26.907 に答える
1
100% 純粋な bash (そして面白い!) の可能性:
#!/bin/bash
shopt -s nullglob
a=( *[a-k]* )
b=(); for i in "${a[@]}"; do [[ "$i" = *[p-z]* ]] && b+=( "$i" ); done
c=(); for i in "${b[@]}"; do [[ "$i" = *[1-9]* ]] && c+=( "$i" ); done
printf "%s\n" "${c[@]}"
外部プロセスは一切ありません!パイプなし!純粋なバッシュのみ!名前に変な記号 (改行など) が含まれるファイルに関しては 100% 安全です (これは を使用する他の方法には当てはまりませんls
)。そして、出力を再利用するために、実際にファイル名に変な記号を表示し、それらを適切に引用したい場合は、次を使用します
printf "%q\n" "${c[@]}"
最後のprintf
ステートメントの代わりに。
ノート。パターン[a-k]
は、[p-z]
ロケールに依存します。他の何かではなく、それが本当に意味するLC_ALL=C
ことを確認するように設定したい場合があります。[a-k]
[abcdefghijk]
[aAbBcCdDeEfFgGhHiIjJk]
お役に立てれば!
于 2012-12-28T13:20:03.110 に答える
0
順序が重要ではなく、文字が 1 回以上表示される場合は、連鎖した grep を使用できます。
ls | egrep "[a-k]" | egrep "[m-p]" | egrep "[1-9]"
順序が重要な場合は、glob パターンを使用してください
ls *[a-k]*[m-p]*[1-9]*
于 2012-12-28T13:04:44.353 に答える
0
完全にするには、すべての組み合わせを検索する必要があります。
ls *[a-k]*[m-p]*[1-9]* *[a-k]*[1-9]*[m-p]* \
*[m-p]*[a-k]*[1-9]* *[m-p]*[1-9]*[a-k]* \
*[1-9]*[m-p]*[a-k]* *[1-9]*[a-k]*[m-p]*
于 2012-12-28T17:13:31.880 に答える