2

「。」で始まるファイルをループしたい ディレクトリ x (x は任意のパス):

$ for file in x/.*
> do
>     echo -n $file" "
> done
x/. x/.. x/..a x/.b

x/. と x/.. を取り除く最良の方法は何ですか?

4

9 に答える 9

5

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
于 2010-03-31T02:56:19.763 に答える
3

パターン を使用します.{[^.]*,.?*}。これは、 で始まり、その後に 以外の文字が続く名前、または で始まり、その後.に文字が続く名前を意味します。...

また"$file"、スペースを含む名前がバラバラにならないように、引用符で囲む必要があります。

于 2010-03-31T02:47:03.223 に答える
1

別の人が指摘したように、ls -Aは除外します。そして..リストから、それがどれほど標準的かはわかりません。

findも使用できます。

find .  -mindepth 1 -maxdepth 1 -name '.*'
于 2010-03-31T02:52:47.623 に答える
1

グロビングのみのソリューションであるため、コマンドの置換と引用符で問題を起こす必要はありません。

.!(.|)

これには、extglob シェル オプションを設定する必要があります。

shopt -s extglob

これはおそらく明らかですが、この!()構成は、リストされている ( で区切られた) パターンの 1 つ以外のものを意味し|ます。

于 2010-03-31T02:57:45.287 に答える
0
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'
于 2010-03-31T02:49:00.037 に答える
0

(1) 2 つのパターンを使用します: $ echo x/.??* x/.[^.] - 他の組み合わせがあります。別のものを使用する場合は、「...」と「.a」をキャッチすることを確認してください

(2) GLOBIGNORE を使用し、次の 2 つのエントリを除外します。 $ GLOBIGNORE='*/.:*/..'; エコー x/.*

(3) GLOBIGNORE で dotglob を使用します。これにより、自動的に除外されます。そして..、しかし今は「残りのすべて」を除外する必要があります: $ shopt -s dotglob; GLOBIGNORE='*/[^.]*'; エコー x/*

于 2010-03-31T03:05:11.777 に答える
0

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 番目のグループのファイルとは照合されません。

于 2010-03-31T03:08:51.567 に答える
0

もう 1 つのオプションは、グロビングをシンプルに保ち、不要なパスを明示的に削除することです。

for file in x/.* ; do
    [[ $file == */. || $file == */.. ]] && continue
    echo -n "$file "
done
于 2016-04-13T12:35:03.157 に答える
0

Mac OS X で使用ls -Aします。ローカル オプションの実装については、man ページを確認してください。このコマンド

ls -A | grep '^\.'

あなたが探しているリストをくれました。

于 2010-03-31T02:49:08.147 に答える