ターミナルで隠しファイルのみを表示する方法は?


154

私は何千ものファイルを含むディレクトリを持っていますが、それらのいくつかは隠されています。

このコマンドls -aは、隠しファイルを含むすべてのファイルをリストしますが、隠しファイルをリストするだけです。

どのコマンドを使用する必要がありますか?


1
シンプルls -ld .*またはls -ald .*機能します
ジョン・ストロード

回答:


189

コマンド :

ls -ld .?* 

隠しファイルのみをリストします。

説明する:

 -l     use a long listing format

 -d, --directory
              list  directory entries instead of contents, and do not derefer‐
              ence symbolic links

.?* will only state hidden files 

8
そこに2つの疑問符は必要ありません。*はそれを覆います(?は任意の1文字にのみ一致し、*は任意の数に一致します)。
プソイ

13
@psusi、私は意図は除外することだと思う...一致するから。ただし.a、などの単一文字の隠しファイル名も(完全に合法的に)除外されます.1。おそらく、より良い拡張グロブは次のようになり.!(|.)何か別(シングル)つまり、ドット以外のものが続くつまり文字通りのドットls -d .!(|.)
steeldriver

@steeldriver、きちんとした、?? バージョンは「。」を除外します および「..」。これは興味深い癖の結果のようです:どちらでもない?また、*はドットと一致しますが、?一致しなければならない何かそれ以外の名前は無視されます。
psusi

ディレクトリとファイルを識別するには、Fオプションを追加します。つまり、ls -ldF。?*ディレクトリ名には、最後に表示される文字ファイルにはない「/」が含まれます。
RCF

1
これは、.vimなどの隠しフォルダーもリストすることを除いて、ほとんど機能します。ls -ldp。?*のように少し変更します。grep -v /これは隠しフォルダーではなく隠しファイルのみをリストします
フレッドヤン

31
ls -d .!(|.)

OPが探しているものとまったく同じです。


1
それはどのように機能しますか?
SarcasticSully

ディレクトリを何でもリストします。そして、それなしで何もリストしないことはほとんどそれが翻訳するものです。
パトリック

1
私はであることを理解し!(pattern-list)pattern-listで区切られた1つのまたは複数のパターンのリストである|が、それはあなたがの左に任意のパターンを持っていないことを私のために混乱しています|。その構文を私に説明してもらえますか?
カルロスメンドーサ

2
@CarlosMendozaは空のパターンになるため、これは.(no またはor .)が続かないようなもので、.それ自体とを除外します..
ムール

16

現在のディレクトリにファイルが必要な場合(再帰なし)、次のようにできます。

echo .[^.]*

これは、名前がa .で始まり、その後に1つ以上の非ドット文字が続くすべてのファイルの名前を出力します。これは、名前が連続するドットで始まるファイルでは失敗するため、たとえば表示....fooされないことに注意してください。

以下も使用できますfind

find -mindepth 1 -prune -name '.*'

これ-mindepthにより.、一致しないことが保証され、サブディレクトリに下がらない-prune手段が確保findされます。



4

とを使用findしてawk

find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

説明:

find . -type f ->現在のディレクトリ内のすべてのファイルとそのパスを一覧表示します。

./foo.html
./bar.html
./.foo1

awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

/フィールドセパレータとして、awkはドットで始まる最後のフィールドをチェックします。ドットで始まる場合、対応する行の最後のフィールドを印刷します。


あなただけを使用することができますfind -type f。検索パスやを明示的に設定する必要はありません-name "*"
テルドン

3

find 通常は、名前のグロビングを使用するよりも複雑な検索に適したオプションです。

find . -mindepth 1 -maxdepth 1 -name '.*'

または

find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'

find . 現在のディレクトリを検索します

-mindepth 1除外します。および..リストから

-maxdepth 1 検索を現在のディレクトリに限定します

-name '.*' ドットで始まるファイル名を見つける

-o または

-name '*~' チルダで終わるファイル名を見つける(通常、これらはテキスト編集プログラムからのバックアップファイルです)

ただし、これと他のすべての回答は、現在のディレクトリの.hiddenファイルにあるファイルを見逃します。スクリプトを記述している場合、これらの行は.hiddenファイルを読み取り、存在するファイルのファイル名を表示します。

if [[ -f .hidden]] # if '.hidden' exists and is a file
then
    while read filename # read file name from line
    do
        if [[ -e "$filename" ]] # if the read file name exists
        then
            echo "$filename" # print it
        fi
    done < .hidden # read from .hidden file
fi

.hiddenのファイルは?.hiddenファイル名を含むファイルが呼び出されるのはなぜですか?とにかく、必要なものがすべて必要なときに、なぜ複雑なことをするのでしょうcat .hiddenか?あなたのfindコマンドは正しい(しかし)ですが、-name '*~'関係ありません。チルダで終わるファイルはバックアップファイルですが、決して隠されていません。
テルドン

@terdon .hiddenファイルは、ファイル/フォルダー名をドットで始まるように変更できない場合に非表示にするファイルおよびフォルダー用です。チルダで終わるファイルに関しては、システムに依存します。ls -BほとんどのGUIファイルエクスプローラーと同様に、このようなファイルは無視されます。
マークH

cat .hiddenそれらのファイルがファイルに追加されてから削除または移動された場合、存在しないファイルが表示されることがあり.hiddenます。
マークH

これはうまく機能します。
eng河G

2

次のコマンドでできると思います。

ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"

ls -a 入力したコマンド。現在の作業ディレクトリ内のすべてのファイルとディレクトリが表示されます。

grep "^\."私が追加したコマンドは、出力をフィルタリングして隠しファイルのみを表示します(名前はで始まります".")。

grep -v "^\.$" | grep -v "^\..$" 私が追加したコマンドは、出力をフィルタリングして除外します。、..(現在および親ディレクトリです)。

一部のファイル名にを含む行が複数ある場合"\n"、上記の例は正しくない可能性があります。

そのため、次のコマンドを使用して問題を解決することをお勧めします。

find -maxdepth 1 -name ".[!.]*"


@RaduRădeanu私はあなたのコメントを見ました、それはとても良いです。回答をもう一度編集しました。コメントありがとうございます。
xiaodongjie

2

他に何あなたが行っている可能性、is ls .?*またはls .!(|)それはあなたの下のトップおよびその他のファイル/ディレクトリにカレントディレクトリの隠しファイル/ディレクトリ内のすべてを表示します

例:私の端末から

$ ls .?*       
.bash_history    .dmrc        .macromedia   .weather
.bash_logout     .gksu.lock   .profile      .wgetrc
.bash_profile    .bashrc.save .ICEauthority .toprc           .Xauthority
.bashrc          .lastdir     .viminfo      .xsession-errors
.bashrc~         .dircolors   .lynxrc       .vimrc           .xsession-errors.old

..:
Baron

.adobe:
Flash_Player

.aptitude:
cache  config

.cache:
compizconfig-1                              rhythmbox
dconf                                       shotwell

上記の結果に注目してください。すべてのファイル/ディレクトリとそのサブディレクトリ、およびすぐ下の隠しファイルが表示されます。

[1:0:248][ebaron@37signals:pts/4][~/Desktop]
$ ls .!(|)
.bash_aliases  .bashrc1  .bashrc1~

..:
askapache-bash-profile.txt  examples.desktop             Public           top-1m.csv
backups             Firefox_wallpaper.png        PycharmProjects          top-1m.csv.zip
Desktop             java_error_in_PYCHARM_17581.log  Shotwell Import Log.txt  topsites.txt
Documents           Music                Templates            Videos
Downloads           Pictures                 texput.log           vmware

申し訳ありませんが、コメントできません。間のここでの違いを説明するls .?*とcioby23の答え@ ls -d .[!.]* .??*そして、それは実際には2回の隠しファイルを印刷文字通りあなたが二回求めているためでいる理由.??*.?*.[!.]*彼らは二回印刷されます別のコマンド文字でそれらのいずれかを追加して、同じことです。


1

以下も使用できます。

ls -d .[!.]* .??*

これにより、通常の隠しファイルと、たとえば2つまたは3つのドットで始まる隠しファイルを表示できます。 ..hidden_file


1
これにより、すべての隠しファイルを2回取得します。
TuKsn

1

次のコマンドを使用できます

ls -Ad .??*

これには、ls -a | grep "^\."ソリューションのgrepベースのアプローチとは異なり、複数列のリストを許可するという利点があります


1

これまでのすべての回答は、名前がドットで始まるファイル(またはディレクトリ)が「隠されている」という事実に基づいています。私は別の解決策を思い付きましたが、それは効率的ではないかもしれませんが、この解決策は隠しファイルの名前について何も想定していないため..、結果にリストを表示しません(現在受け入れられている回答と同様)。

完全なコマンドは次のとおりです。

ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)

説明

これは、すべてのファイル(およびディレクトリ)を2回リストすることです。

echo -e "$(\ls)\n$(\ls -A)"

しかし、隠しファイルは一度だけ表示します-A

次に、リストがソートさ| sortれ、通常の(隠されていない)ファイルが2回並んで表示されます。

次に、複数回現れるすべての行を削除し| uniq -u、一意の行のみを残します。

最後にlsもう一度使用して、ユーザーのカスタムオプションを使用して、リストのディレクトリの内容をリストせずに、すべてのファイルをリストし-dます。

編集(制限):

muruが指摘したように、この解決策は、以下のような名前のファイルがある場合、正常に動作しませんescaped\ncharacter.txtので、echo -e2行にファイル名を分割します。また、などの特殊文字を除いて、ほぼ同じ名前の2つの隠しファイルがある場合、期待通りに動作しません.foo[tab].txtし、.foo[new-line].txtそれらの両方のように印刷されているような.foo?.txtとによって排除されるだろうが、uniq -u


1
これがほとんど隠しファイルの定義だと思います。これらの隠しファイルの起源でさえ、.最初の文字として扱う際のバグに由来します。
ムール

最初の段落でそれを(事実として)言及します。ただし、現在受け入れられている回答とは異なる結果が得られます
アレハンドロ

確かに、それは除外さ..れますが、特殊文字を含むファイル名でどれだけうまく機能するのだろうか。
ムール

特殊文字が何を意味するのか正確にはわかりませんが、このソリューションではファイル名について何も想定していないため、問題を引き起こすことはないと思います
-alejandro

実際、少なくとも1つのことを前提としています。ファイル名には改行が含まれていません。また、ファイル名には、echo -e解釈するエスケープシーケンスがありません。また、lsファイル名をマングルしないため、2つの異なるファイル名が同じように表示されます(たとえば、一部のバージョンでls?特殊文字に使用されるため、.foo\tbar\t=> tab)と.foo\nbar\n=> newline)は両方ともとして表示されますfoo?bar)。
ムール

1

または、使用することもできます echo .*

例えば

user@linux:~$ echo .*
. .. .bash_aliases .bash_history .bash_logout .bashrc
user@linux:~$

長いリスト形式で希望する場合は、空白を新しい行に変換するだけです。

user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$ 

0

bashのでは、設定GLOBIGNOREの特別な変数は、いくつかの空でない値は、それが無視させるのに十分である...グロブを展開するときに。Bashドキュメントから:

GLOBIGNOREシェル変数は、パターンに一致するファイル名の集合を制限するために使用されてもよいです。GLOBIGNOREが設定されている場合、パターンのいずれかに一致する一致する各ファイル名GLOBIGNOREは、一致のリストから削除されます。場合nocaseglobオプションが設定され、パターンに対するマッチングは内GLOBIGNOREケースに関係なく行われます。が設定され、nullではない場合、ファイル名...は常に無視され GLOBIGNOREます。ただし、GLOBIGNOREnull以外の値に設定すると、dotglobシェルオプションが有効になるため、‘.'で始まる他のすべてのファイル名が一致します。

我々はそれを設定した場合.:..の両方、.および..無視されます。null以外の値に設定するとこの動作が発生するため、次のように設定することもできます。.

そう:

GLOBIGNORE=.
ls -d .*
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.