「.git」と「..」を除くすべてのドットファイルをコピーします。

「.git」と「..」を除くすべてのドットファイルをコピーします。

.[!.]*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 '.*'

-iregexfindでも使用できます。

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 CN

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から除外されなくなることを意味するため、設定はFIGNOREzshまたはbash5.2 +でこのオプションを設定するのと.:..同じ効果があります。dotglob

bashにはGLOBIGNOREkshに似た変数がFIGNOREありますが、そのデザインはひどいだから私はそれを使用しないことをお勧めします。

もちろん、以下から明示的に除外することもできます。

function println { [ "$#" -eq 0 ] || printf '%s\n' "$@"; }
println ~(N).!(git)

関連情報