回答:
コマンド :
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
.
と..
一致するから。ただし.a
、などの単一文字の隠しファイル名も(完全に合法的に)除外されます.1
。おそらく、より良い拡張グロブは次のようになり.!(|.)
何か別(シングル)つまり、ドット以外のものが続くつまり文字通りのドットls -d .!(|.)
ls -d .!(|.)
OPが探しているものとまったく同じです。
!(pattern-list)
、pattern-list
で区切られた1つのまたは複数のパターンのリストである|
が、それはあなたがの左に任意のパターンを持っていないことを私のために混乱しています|
。その構文を私に説明してもらえますか?
.
(no またはor .
)が続かないようなもので、.
それ自体とを除外します..
。
とを使用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 "*"
。
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 '*~'
関係ありません。チルダで終わるファイルはバックアップファイルですが、決して隠されていません。
.hidden
ファイルは、ファイル/フォルダー名をドットで始まるように変更できない場合に非表示にするファイルおよびフォルダー用です。チルダで終わるファイルに関しては、システムに依存します。ls -B
ほとんどのGUIファイルエクスプローラーと同様に、このようなファイルは無視されます。
cat .hidden
それらのファイルがファイルに追加されてから削除または移動された場合、存在しないファイルが表示されることがあり.hidden
ます。
次のコマンドでできると思います。
ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
ls -a
入力したコマンド。現在の作業ディレクトリ内のすべてのファイルとディレクトリが表示されます。
grep "^\."
私が追加したコマンドは、出力をフィルタリングして隠しファイルのみを表示します(名前はで始まります"."
)。
grep -v "^\.$" | grep -v "^\..$"
私が追加したコマンドは、出力をフィルタリングして除外します。、..(現在および親ディレクトリです)。
一部のファイル名にを含む行が複数ある場合"\n"
、上記の例は正しくない可能性があります。
そのため、次のコマンドを使用して問題を解決することをお勧めします。
find -maxdepth 1 -name ".[!.]*"
ls
ください。
他に何あなたが行っている可能性、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回の隠しファイルを印刷文字通りあなたが二回求めているためでいる理由.??*
、.?*
、.[!.]*
彼らは二回印刷されます別のコマンド文字でそれらのいずれかを追加して、同じことです。
これまでのすべての回答は、名前がドットで始まるファイル(またはディレクトリ)が「隠されている」という事実に基づいています。私は別の解決策を思い付きましたが、それは効率的ではないかもしれませんが、この解決策は隠しファイルの名前について何も想定していないため..
、結果にリストを表示しません(現在受け入れられている回答と同様)。
完全なコマンドは次のとおりです。
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 -e
2行にファイル名を分割します。また、などの特殊文字を除いて、ほぼ同じ名前の2つの隠しファイルがある場合、期待通りに動作しません.foo[tab].txt
し、.foo[new-line].txt
それらの両方のように印刷されているような.foo?.txt
とによって排除されるだろうが、uniq -u
.
最初の文字として扱う際のバグに由来します。
..
れますが、特殊文字を含むファイル名でどれだけうまく機能するのだろうか。
echo -e
解釈するエスケープシーケンスがありません。また、ls
ファイル名をマングルしないため、2つの異なるファイル名が同じように表示されます(たとえば、一部のバージョンでls
は?
特殊文字に使用されるため、.foo\tbar
(\t
=> tab)と.foo\nbar
(\n
=> newline)は両方ともとして表示されますfoo?bar
)。
bashのでは、設定GLOBIGNORE
の特別な変数は、いくつかの空でない値は、それが無視させるのに十分である.
と..
グロブを展開するときに。Bashドキュメントから:
GLOBIGNORE
シェル変数は、パターンに一致するファイル名の集合を制限するために使用されてもよいです。GLOBIGNORE
が設定されている場合、パターンのいずれかに一致する一致する各ファイル名GLOBIGNORE
は、一致のリストから削除されます。場合nocaseglob
オプションが設定され、パターンに対するマッチングは内GLOBIGNORE
ケースに関係なく行われます。が設定され、nullではない場合、ファイル名.
と..
は常に無視されGLOBIGNORE
ます。ただし、GLOBIGNORE
null以外の値に設定すると、dotglobシェルオプションが有効になるため、‘.
'で始まる他のすべてのファイル名が一致します。
我々はそれを設定した場合.:..
の両方、.
および..
無視されます。null以外の値に設定するとこの動作が発生するため、次のように設定することもできます。.
そう:
GLOBIGNORE=.
ls -d .*
ls -ld .*
またはls -ald .*
機能します