.[!.]*
and以外のディレクトリ内のすべてのドットファイルを参照するためにusingを使用する方法を知っていますが、およびを除くすべてのドットファイルを参照するには..
どう..
すればよいですか.git
?.[!.||.git]*
など.[!.][!.git]*
のいくつかのバリエーションを試しましたが、それらのどれも期待されるファイルを参照しません。
答え1
Bashでは拡張ワイルドカードを使用できます。
shopt -s extglob
ls .!(.|git)
ただし、これも一致しているため、必要になる場合が.
あります。
ls .!(|.|git)
答え2
以下を使用して見つけることができます。
find . -type f '!' -iname ".git" -exec cp -rv {} /dest/path \;
.git
私たちが使用したファイルを除いて、現在のディレクトリ内のすべてのファイルを検索します! -iname
(これは!
、次のようなものではないことを意味します。) 次に、ファイルをターゲットの場所にコピーします。
修正する
find . -not -path '.' -not -path './.git' -iname '.*'
-iregex
findでも使用できます。
find . -not -iregex '.\|./.git' -iname '.*'
..
どちらの例も、およびを除く現在のパスのすべてのドットファイルを参照します。.git
答え3
隠しファイルを除くすべての隠しファイルを再帰的に検索するには(名前が続くファイル.
と名前が再帰的に始まるディレクトリ内のファイルを含む)、.
.git
LC_ALL=C find . -path ./.git -prune -o -path '*/.*' -print
別の場所にコピーするには、find
次の隠しディレクトリ検索を停止する必要があります。
LC_ALL=C find . -path ./.git -prune -o -name '.?*' -prune -exec sh -c '
exec cp -Rip "$@" /path/to/destination/' {} +
(このオプションは、最終コピーが作成される時期と-i
時期を。)./foo/.file
./bar/.file
/path/to/destination/.file
GNU実装を使用すると、cp
次のsh
オプションを使用してこの問題を回避できます-t
。
LC_ALL=C find . -path ./.git -prune -o -name '.?*' -prune \
-exec exec cp -ait /path/to/destination/ {} +
これは最上位.git
ディレクトリ/ファイルだけをスキップします。飛び越えるどの .git
ファイルはサブディレクトリにあるファイル-path ./.git
でも-name .git
。
答え4
zsh では、Forsyth シェルや派生物 (pdksh や mksh などの派生物) と同様に、glob 拡張子には含まれていないため、現在の作業ディレクトリのファイルを一覧表示します.
(特殊な項目と次のことができます)。..
.*
.git
.
..
set -o extendedglob
print -rC1 .^git(N)
.
バージョン5.2以降、globskipdots..
オプションをオフにしない場合、globskipdotsオプションもデフォルトで除外されます。bash
拡張glob構文はksh88以降に形成され、bashにはolumnprint
の組み込みコマンドがなく、glob修飾子を使用してglobごとにullglobオプションをオンにすることはできないため、対応するものは次のとおりです。1
C
N
println() { [ "$#" -eq 0 ] || printf '%s\n' "$@"; }
shopt -s extglob nullglob
println .!(git)
以前のバージョンでは、dotglobオプションが有効になっていて明示的な一致がない限り、glob拡張に含めることができるため、.
以前のバージョンでは次のことができます。..
.
println() { [ "$#" -eq 0 ] || printf '%s\n' "$@"; }
shopt -s extglob nullglob dotglob
println [.]!(git)
[.]
.
代わりに一致しません明らかに。
または、次のように明示的に除外します。
println() { [ "$#" -eq 0 ] || printf '%s\n' "$@"; }
shopt -s extglob nullglob
println .!(|.|git)
ksh93u+m 2020-08-09以降、ksh93はそれ自体がスキップされます.
。..
ksh93以降はzshのglob qualifierと機能的にも同じです~(N)
。N
function println { [ "$#" -eq 0 ] || printf '%s\n' "$@"; }
println ~(N).!(git)
以前のバージョンでは、次のことができます。
function println { [ "$#" -eq 0 ] || printf '%s\n' "$@"; }
FIGNORE=.:..
println ~(N).!(git)
この設定は、隠しファイルがglobから除外されなくなることを意味するため、設定はFIGNORE
zshまたはbash5.2 +でこのオプションを設定するのと.:..
同じ効果があります。dotglob
bashにはGLOBIGNORE
kshに似た変数がFIGNORE
ありますが、そのデザインはひどいだから私はそれを使用しないことをお勧めします。
もちろん、以下から明示的に除外することもできます。
function println { [ "$#" -eq 0 ] || printf '%s\n' "$@"; }
println ~(N).!(git)