web-dev-qa-db-ja.com

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

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

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

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

150
nux

コマンド :

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 
181
nux
ls -d .!(|.)

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

30
patrick

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

echo .[^.]*

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

findを使用することもできます。

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

-mindepthは、.と一致しないことを保証し、-Pruneは、findがサブディレクトリに降りないことを意味します。

16
terdon
ls -ad .*

bashで私のために働いています。

14
Mark

findおよびawkを使用して、

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

説明:

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

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

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

/フィールド区切りawkは、ドットで始まる最後のフィールドをチェックします。ドットで始まる場合、対応する行の最後のフィールドを印刷します。

4
Avinash Raj

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
3
Mark H

他に何ができたか、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 answer ls -d .[!.]* .??*の違いを説明するために、実際に隠しファイルを2回印刷しているのは、文字列で.??*.?*.[!.]*を2回要求しているためです。 2回印刷されます。

2
amrx

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

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

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

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

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

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

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

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

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

ls -Ad .??*

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

1
Maythux

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

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

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

説明

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

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

ただし、-Aの隠しファイルは1回だけ表示されます。

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

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

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

編集(制限):

Muruが指摘したように、escaped\ncharacter.txtなどの名前のファイルがある場合、echo -eはファイル名を2行に分割するため、このソリューションは正しく機能しません。 .foo[tab].txt.foo[new-line].txtなどの特殊文字を除き、ほぼ同じ名前の隠しファイルが2つある場合も期待どおりに機能しません。これらは両方とも.foo?.txtとして印刷され、 uniq -uによって除去されます

1
alejandro

または、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:~$ 
1
Sabrina

以下も使用できます。

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

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

1
cioby23

Bashでは、GLOBIGNORE特殊変数を設定すると、グロブを展開するときに.および..を無視するのに十分な空でない値で十分です。 Bashドキュメント から:

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

.:..に設定すると、...の両方が無視されます。 null以外の値に設定するとこの動作が発生するため、.に設定することもできます。

そう:

GLOBIGNORE=.
ls -d .*
0
muru