すべての隠しファイルとディレクトリをグロブしたいが、現在の(.
)と親ディレクトリ(..
)はグロブしたくない。
私はbashを使用しています。
現在の行動を観察する:
$ ls -a
. .. ...a ...aa ..a ..aa .a .aa .aaa a
$ echo *
a
$ echo .*
. .. ...a ...aa ..a ..aa .a .aa .aaa
.*
をこのように動作させたい
$ echo .*
...a ...aa ..a ..aa .a .aa .aaa
シェルオプションdotglob
があります
$ shopt -s dotglob
それはある方法で機能します。今、私は*
を使用してすべて(非表示かどうかにかかわらず)をグロブできますが、.
と..
はグロブできません
$ echo *
...a ...aa ..a ..aa .a .aa .aaa a
しかし今、私は隠されているかどうかを区別できません。また、.*
は引き続き.
および..
をグロブします
$ echo .*
. .. ...a ...aa ..a ..aa .a .aa .aaa
.*
を.
および..
に展開しないようにする方法はありますか?
GLOBIGNORE
変数を使用して、.
および..
ディレクトリを非表示にすることができます。これにより、dotglob
オプションも自動的に設定されるため、*
は隠しファイルと非隠しファイルの両方に一致するようになりました。 dotglob
の設定を手動で解除することもできますが、これにより必要な動作が得られます。
この例を見てください:
$ ls -a
. .. a .a ..a
$ GLOBIGNORE=".:.."
$ shopt -u dotglob
$ echo * # all (only non-hidden)
a
$ echo .* # all (only hidden)
.a ..a
このグロブには、先行ドットと少なくとも1つの他の非ドット文字が必要です。これにより、すべての隠しファイルがグロブ化されますが、.
または..
はグロブ化されません。
ls -ld .[!.]*
ファイルを探しているだけですか? find
を使用する立場にありますか?
(GNU find
と仮定して)のようなもの:
find . -mindepth 1 -maxdepth 1 -name ".*" -printf "%P\n"
非表示のファイル/フォルダを表示したいが、.
および..
?
このbashワイルドカードを使用してください{.[!.]*,..?*}
サンプルデータ
サンプルデータを生成して試すことができます:
$ touch ...a ...aa ..a ..aa .a .aa .aaa a
$ mkdir ...b ...bb ..b ..bb .b .bb .bbb b
証明
以下に、削除されることが予想されるエントリを示します。
$ diff <(\ls -a) <(\ls -ad {.[!.]*,..?*})
1,3d0
< .
< ..
< a
11d7
< b
プロ
たとえば、すべての非表示要素を削除するのに役立ちます。
$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
# <regenerate sample data here>
$ rm -rf {.[!.]*,..?*}
# No error
ls -A
。
マニュアルからの抜粋
"-A、--almost-allは暗黙の。と..をリストしません。")
ls -1a|egrep -v '^(\.|\.\.)$'