私はLinuxとLinuxのコマンドラインと次の文を理解しようとしています。
(現在のディレクトリと親ディレクトリ)が
.*
一致すると、グローバルな問題が発生する可能性があります。または、同じパターンを使用してすべてのドットファイルをインポートできます。.
..
.[^.]*
.??*
とは別に現在のディレクトリと親ディレクトリです。
源泉:Linuxの仕組み:すべての上級ユーザーが知っておくべきこと ブライアン・ワード、第2版、
セクション2.7「ドットファイル」、23ページ (登録/ログインが必要)
または Linuxの仕組み:すべての上級ユーザーが知っておくべきこと ブライアン・ワード、第3版、
セクション2.7「ドットファイル」、22ページ
.[^.]*
正確にいつ(どのコマンドで)またはを使用しますか.??*
?
答え1
これは、Forsythシェル(および派生物を含む)以外のシェルでバグ/不正な機能を解決するためのものですzsh
。ここでglobの拡張には、(残念ながらそれを返すシステムで)が含まれます。fish
pdksh
.*
.
..
readdir()
この殻で、
chmod -R og-rwx .*
たとえば、rwx権限は、現在のディレクトリの隠しファイルとディレクトリだけでなく、現在の()ディレクトリと.
親()ディレクトリに対しても繰り返し削除されます。..
ls .*
これは、再帰的に操作を実行したり、chown -R .*
などのディレクトリで動作するコマンドにfind .*
特に悪いです。しかし、他のほとんどのコマンドにはまだ迷惑なので、これらのコマンドを含めたいgrep -r blah .*
コマンドは思い出されません。ファイルリストからコマンドを渡します。.
..
rm
ユーティリティに安全装置を追加する必要があります。あまりにも多くの人がぶら下がっているので、このバグを修正してくださいrm -rf .*
。
追加すると、すべてのファイル(隠されているかどうかにかかわらず)をcommand()*
に引数として渡すためにも使用されます。cmd -- .[!.]* ..?* *
シェルによって異なる解決策を見つけることができます。。
glob .[^.]*
(.[!.]*
Bourne / POSIXシェルでは)は.
(少なくとも2文字のファイル名と一致するため)と..
(2番目の文字が.
一致しないため)を除外しますが、2番目のglobを必要とする[^.]
ファイルも除外します。..foo
..?*
これら.
は..
ディレクトリ巡回のためのツールであり、通常のファイルのようにリストするのは間違いです。 POSIXでは、パスコンポーネント(例open(".")
:、)で理解する必要がありますstat("foo/../bar")
が、必ずしもディレクトリエントリとして実装されたり含まれたりする必要はありませんreaddir()
。
getdents()
それにもかかわらず、ほとんどのシステムはまだ初期のUnicesのようにハードリンクを実装しており、ほとんどのシステムは/出力からそのエントリを偽造しませんreaddir()
。
の場合、bash
別の方法はオプションをオンにしてdotglob
次を使用することです。
chmod -R og-rwx [.]*
(ただし、隠しファイルでない場合/動作を[.]*
模倣するオプションがないと、ファイルの権限が変更される可能性があります。)failglob
zsh
fish
記録によると、.
隠しファイルで始まるファイル名は次のようになります。誰かがスキップしようとしたコーディングエラーのために誕生しました.
。..
。皮肉なことに、隠しファイルで操作を実行しようとすると同じ問題が発生します。
¹ globskipdots
bash 5.2+のオプションも参照してください
答え2
隠された名前(ドットで始まる)を持つすべてのファイルとディレクトリを別の場所に移動したい場合:
mv .[^.]* old-dot-files/
または、すべてのドットファイルまたはディレクトリのドットディレクトリに対して操作を実行したい場合は、いつでも次の操作を行います。
for name in .[^.]*; do
# process "$name"
done
このパターンでは、.??*
一致する名前に少なくとも3文字を含める必要があるため、.a
同様の名前は選択されません。 .[^.]*
一方、名前の前に2つの点がある項目はスキップされます。
一致する名前を明示的にテストする方が良いかもしれません。
for name in .*; do
# expecting a regular file
if [ -f "$name" ]; then
# process "$name"
fi
done
for name in .*; do
# expecting a directory other than . and ..
if [ -d "$name" ] && [ "$name" != '.' ] && [ "$name != '..' ]; then
# process "$name"
fi
done
私の経験では、すべてのドットファイルまたはディレクトリのドットディレクトリに対していくつかの操作を実行したい場合はほとんどありません。