私は何千ものファイルを含むディレクトリを持っていますが、それらのいくつかは隠されています。
コマンドls -a
は、隠しファイルを含むすべてのファイルをリストしますが、隠しファイルをリストするだけです。
どのコマンドを使用する必要がありますか?
コマンド :
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
ls -d .!(|.)
OPが探しているものとまったく同じです。
現在のディレクトリにファイルが必要な場合(再帰なし)、次のようにできます。
echo .[^.]*
これは、名前が.
で始まり、その後に1つ以上の非ドット文字が続くすべてのファイルの名前を出力します。これは、名前が連続するドットで始まるファイルでは失敗するため、たとえば....foo
は表示されないことに注意してください。
find
を使用することもできます。
find -mindepth 1 -Prune -name '.*'
-mindepth
は、.
と一致しないことを保証し、-Prune
は、find
がサブディレクトリに降りないことを意味します。
ls -ad .*
bashで私のために働いています。
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
は通常、名前のグロビングを使用するよりも複雑な検索に適したオプションです。
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
他に何ができたか、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回印刷されます。
次のコマンドでできると思います。
ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
入力したls -a
コマンド。現在の作業ディレクトリ内のすべてのファイルとディレクトリが表示されます。
私が追加したgrep "^\."
コマンドは、出力をフィルタリングして隠しファイルのみを表示します(名前は"."
で始まります)。
grep -v "^\.$" | grep -v "^\..$"
コマンドを追加しました。これは、出力を除外して。、..を除外します(現在および親のディレクトリです)。
一部のファイル名に"\n"
を含む行が複数ある場合、上記の例は正しくない可能性があります。
そこで、次のコマンドを実行して問題を解決することをお勧めします。
find -maxdepth 1 -name ".[!.]*"
次のコマンドを使用できます
ls -Ad .??*
これには、ls -a | grep "^\."
ソリューションでのgrepベースのアプローチとは異なり、複数列のリストを許可するという利点があります
これまでの答えはすべて、名前がドットで始まるファイル(またはディレクトリ)が「隠されている」という事実に基づいています。私は別の解決策を思い付きましたが、それは効率的ではないかもしれませんが、この解決策は隠しファイルの名前について何も想定していないため、結果に..
をリストしません(現在受け入れられている回答と同様)。
完全なコマンドは次のとおりです。
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
によって除去されます
または、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:~$
以下も使用できます。
ls -d .[!.]* .??*
これにより、通常の隠しファイルと、たとえば2つまたは3つのドットで始まる隠しファイルを表示できます。..hidden_file
Bashでは、GLOBIGNORE
特殊変数を設定すると、グロブを展開するときに.
および..
を無視するのに十分な空でない値で十分です。 Bashドキュメント から:
GLOBIGNORE
シェル変数を使用して、パターンに一致するファイル名のセットを制限できます。GLOBIGNORE
が設定されている場合、GLOBIGNORE
のパターンのいずれかに一致する一致する各ファイル名は、一致のリストから削除されます。nocaseglob
オプションが設定されている場合、GLOBIGNORE
のパターンに対するマッチングは、大文字小文字に関係なく実行されます。ファイル名.
および..
は、GLOBIGNORE
が設定されていてnullでない場合、常に無視されます。ただし、GLOBIGNORE
をnull以外の値に設定すると、dotglobシェルオプションが有効になるため、‘.
'で始まる他のすべてのファイル名が一致します。
.:..
に設定すると、.
と..
の両方が無視されます。 null以外の値に設定するとこの動作が発生するため、.
に設定することもできます。
そう:
GLOBIGNORE=.
ls -d .*