「。」で始まるファイルをループしたい ディレクトリ x (x は任意のパス):
$ for file in x/.*
> do
> echo -n $file" "
> done
x/. x/.. x/..a x/.b
x/. と x/.. を取り除く最良の方法は何ですか?
bashでは、使用できますGLOBIGNORE
$ ls -1tra
..
.test1
.test
test
.
$ for i in .*; do echo $i;done
.
..
.test
.test1
$ GLOBIGNORE=".:.."
$ for i in .*; do echo $i;done
.test
.test1
パターン を使用します.{[^.]*,.?*}
。これは、 で始まり、その後に 以外の文字が続く名前、または で始まり、その後.
に文字が続く名前を意味します。.
..
また"$file"
、スペースを含む名前がバラバラにならないように、引用符で囲む必要があります。
別の人が指摘したように、ls -Aは除外します。そして..リストから、それがどれほど標準的かはわかりません。
findも使用できます。
find . -mindepth 1 -maxdepth 1 -name '.*'
グロビングのみのソリューションであるため、コマンドの置換と引用符で問題を起こす必要はありません。
.!(.|)
これには、extglob シェル オプションを設定する必要があります。
shopt -s extglob
これはおそらく明らかですが、この!()
構成は、リストされている ( で区切られた) パターンの 1 つ以外のものを意味し|
ます。
for file in x/.*; do echo "$file "; done | grep -v "x/\.\{1,2\} $" | tr -d '\n'
inの$file
前後のスペースは重要です。リストの間にスペースがあり、すべてがぎゅうぎゅう詰めにならないようにします。$
grep
またはより一般的に
for file in somedir/.*; do echo "$file "; done | grep -v "\w/\.\{1,2\} $" | tr -d '\n'
(1) 2 つのパターンを使用します: $ echo x/.??* x/.[^.] - 他の組み合わせがあります。別のものを使用する場合は、「...」と「.a」をキャッチすることを確認してください
(2) GLOBIGNORE を使用し、次の 2 つのエントリを除外します。 $ GLOBIGNORE='*/.:*/..'; エコー x/.*
(3) GLOBIGNORE で dotglob を使用します。これにより、自動的に除外されます。そして..、しかし今は「残りのすべて」を除外する必要があります: $ shopt -s dotglob; GLOBIGNORE='*/[^.]*'; エコー x/*
for file in x/.{[^.],.?}*
これは、たとえば .a .zoo.17 ... ..0 ..hello に一致します。
一致しません。.. ドットで始まらないファイル
それを壊して...
{a,b} は、最初に a に一致し、次に b に一致します。したがって、上記を次のように書くこともできます。
for file in x/.[^.]* x/..?*
最初のものを調べてみましょう: .[^.]* [^.] は逆文字クラスです -- カラット ^ がないと、ドットだけに一致します。^ はそれを反転するため、ドット以外の任意の文字と一致します。その後に星があり、任意の種類の 0 個以上の文字に一致します。したがって、このパターン .[^.]* は、.[^.]* で始まる名前のファイルに一致します。- 少なくとも 2 文字の長さ - 2 番目の文字はそうではありません。上記の例から、次のように一致します: .a .zoo.17
次に、2 番目を調べてみましょう: ..?* ? 任意の文字に一致します (ただし、0 文字には一致しません)。私たちはその星に精通しています。したがって、このパターン ..?* は、名前が - .. で始まる - 少なくとも 3 文字の長さであるファイルと一致します。上記の例から、次のように一致します。
交互の動作方法により、最初のグループのファイルはすべて最初に照合されます。これらのファイルは、2 番目のグループのファイルとは照合されません。
もう 1 つのオプションは、グロビングをシンプルに保ち、不要なパスを明示的に削除することです。
for file in x/.* ; do
[[ $file == */. || $file == */.. ]] && continue
echo -n "$file "
done
Mac OS X で使用ls -A
します。ローカル オプションの実装については、man ページを確認してください。このコマンド
ls -A | grep '^\.'
あなたが探しているリストをくれました。