".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에는 olumn print에 대한 내장 명령이 없으며 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)

관련 정보