web-dev-qa-db-ja.com

現在のディレクトリと親ディレクトリを除くすべての隠しファイルをグロブする方法

すべての隠しファイルとディレクトリをグロブしたいが、現在の(.)と親ディレクトリ(..)はグロブしたくない。

私は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

.*.および..に展開しないようにする方法はありますか?

70
lesmana

GLOBIGNORE変数を使用して、.および..ディレクトリを非表示にすることができます。これにより、dotglobオプションも自動的に設定されるため、*は隠しファイルと非隠しファイルの両方に一致するようになりました。 dotglobの設定を手動で解除することもできますが、これにより必要な動作が得られます。

この例を見てください:

$ ls -a
.  ..  a  .a  ..a
$ GLOBIGNORE=".:.."
$ shopt -u dotglob
$ echo * # all (only non-hidden)
a
$ echo .* # all (only hidden)
.a ..a
65
Marcel Stimberg

このグロブには、先行ドットと少なくとも1つの他の非ドット文字が必要です。これにより、すべての隠しファイルがグロブ化されますが、.または..はグロブ化されません。

ls -ld .[!.]*
20
bukzor

ファイルを探しているだけですか? findを使用する立場にありますか?

(GNU findと仮定して)のようなもの:

find . -mindepth 1 -maxdepth 1 -name ".*" -printf "%P\n"
6
Deano

非表示のファイル/フォルダを表示したいが、.および..

この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
4
frntn

ls -A

マニュアルからの抜粋

"-A、--almost-allは暗黙の。と..をリストしません。")

2
Orso Grigio
ls -1a|egrep -v '^(\.|\.\.)$'
0
codehead