4

現在のフォルダーに含まれるすべてのファイル名を印刷する必要がある演習があります。これらのファイルには、文字の1つと少なくとも[a-k]1回(それぞれ)が含まれています。おそらく(glob-style)を使用する必要があります。[m-p][1-9]ls

4

4 に答える 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 に答える