점으로 시작하는 파일을 어떻게 복사합니까?


26

디렉토리 A의 모든 파일을 디렉토리 B로 복사하려고합니다. 디렉토리 A의 모든 파일은 다음과 같이 점으로 시작합니다.

A/.a
A/.b
A/.c

내가 사용하면 발견했습니다 : cp A/* B, 항상 오류가 발생합니다.

cp: cannot stat 'A/*': no such file or directory

을위한 옵션이 없습니다 것 cp같은 ls사람이 어떻게 문제를 해결하는 아이디어를 가지고, 점으로 시작 핸들 항목은?

답변:


34

에 있기 때문에 그 이유는 bash, *점으로 시작하는 파일에 포함되지 않는 ( .).

당신은 실행할 수 있습니다

cp A/.* B

그것은 복사하지 않았 음을 경고합니다 .또는 ..하위 디렉토리를하거나,하지만이 괜찮습니다.

또는 도트 파일과 일반 파일을 함께 복사하려면 다음을 실행하십시오.

cp A/.* A/* B

당신은 또한 실행할 수 있습니다

shopt -s dotglob
cp A/* B

작동 bash하지만 작동 하지 않습니다 sh.

하위 디렉토리도 복사되지 않는다면 이것이 가장 쉬운 방법입니다.

cp -R A/ B

팁 : 와일드 카드가 예상대로 작동하지 않는 경우 에코로 실행 해보십시오. 예 :

$ echo A/*
A/file1 A/file2

$ echo A/.*
A/. A/.. A/.hidden1 A/.hidden2

$ echo A/.* A/*
A/. A/.. A/.hidden1 A/.hidden2 A/file1 A/file2

$ shopt -s dotglob
$ echo A/*
A/file1 A/file2 A/.hidden1 A/.hidden2

를 사용하는 경우에만 문제가됩니다 -r. 이 없으면 -r디렉토리를 건너 뜁니다.
Mikel

그리고 내가 사용하는 예 -R는 잘 작동합니다. 잘못되었다고 생각되면 그 이유를 설명하십시오.
Mikel

7

bash 인 경우 dotglob복사하기 전에 설정할 수 있습니다

shopt -s dotglob
cp A/* /destination

또는 프로그래밍 언어

$ ruby -rfileutils -e  'Dir[".*"].each {|x| FileUtils.copy(x,"/destination") if File.file?x}'

도트 글로브를 설정하지 않으려면

cp A/.* /destination 2>/dev/null

dotglob OP를 사용하면 숨겨지지 않은 모든 파일을 복사 할 수 있습니다.
peoro

@ peoro, 질문을 다시 읽어야합니다. 의 모든 파일 A이 숨겨져 있습니다. 그는 단지 그것을 복사하고 싶어합니다.

7

당신이 찾고있는 것은 더 많은 라인을 따라 있습니다 :

cp A/.??* B/

이것은 모든 도트 파일과 일치하지만 "."와는 일치하지 않습니다. 또는 "..". 위의 솔루션 중 대부분은 재귀 적으로 작업하지 않는 한 좋습니다. 그러나 다음과 같은 작업을 수행하자마자 :

cp -R A/.??* B/

".."를 생략하지 않으면 도트 파일이 아닌 파일을 포함하여 상위 디렉토리의 모든 항목이 다운됩니다.


1
이 같은 단일 문자입니다 - 파일 점 그리워 할 것이다 .a또는 .x. 내가 찾은 가장 짧은 globbing 패턴 은 .and를 제외한 모든 도트 파일과 일치합니다 . ...[^.]*
pavon

2

방금 다음을 시도해 보았습니다.

cp A/.* B/

2
이것은 또한 매개 변수로 전달 A/.되어 OP가 디렉토리를 복사해야하는 경우 문제가 될 수 있습니다 (를 사용하여 )A/..cpcp -r
peoro

2

그건 아니에요 cp고장 배쉬 펼쳐지는 그것의 bash는, *모두에서 숨겨지지 않은 (예 : 비 시작 .) 파일.

강타는 확장됩니다 .*(따라서 A/.*로 시작하는 모든 파일과 함께, 귀하의 경우)을 .하지만, 불행하게도 그것은 또한 포함 .하고 ..당신이 건너 아마를 원할 것입니다 (현재 부모 디렉토리). (zsh와 같은 다른 쉘에는 쉘이 포함되지 않으며 IIRC도 옵션을 설정 한 후 bash입니다).

쉬운 해결책은 다음 .과 같이 (매우) 해킹 된 방식으로 ..일치하는 파일 을 제거 하고 제거 .*하는 것입니다.

cp $( for F in A/.*; do echo $F | grep -v "^\.*$"; done ) B

또는 이것 (아마도 더 깨끗합니다 : find복사 할 파일을 찾는 데 사용 합니다) :

cp $( find A -maxdepth 1 -mindepth 1 -name ".*" ) B

그러나 더 깨끗한 솔루션을 찾을 수 있습니다.


왜 a를 사용 for loop하고 다음 grep과 같은 일을하기 위해 추가 프로세스 를 만들어야 cp A/.*합니까? cp"."를 무시합니다. 및 ".."디렉토리.

1

모두 점으로 시작하면 A/.*다음을 사용하십시오 .

[holt@Michaela test]$ cp A/* B
cp: cannot stat `A/*': No such file or directory

[holt@Michaela test]$ cp A/.* B
cp: omitting directory `A/.'
cp: omitting directory `A/..'
[holt@Michaela test]$ ls -al B
total 8
drwxrwxr-x. 2 holt holt 4096 2011-03-31 16:57 .
drwxrwxr-x. 4 holt holt 4096 2011-03-31 16:57 ..
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .a
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .b
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .c

이것이 도움이되기를 바랍니다!


1

이 스크립트를 사용할 수 있습니다

IFS = $ '\ n'; $ (find A -d 1)의 행위; cp -R "$ act"B를 수행하십시오. 끝난


0

부:

cp A/.* B

명부:

ls -l A/.*

디렉토리 내림차순으로 파일을 나열하십시오.

ls -ld A/.*

0

제외해야합니다. .. cp에 전달 된 파일 목록에서!

이것은 안전합니다 :

ls -1d A/.[a-zA-Z]* | xargs -i cp -rp {} B

0

이것은 오래된 스레드입니다 ...하지만 항상 모든 파일을 복사 할 수있었습니다. '.'로 시작하는 파일 / 폴더 포함

예를 들어 모든 파일과 폴더를 복사합니다.

cp -aup /root/.* / backup / root /

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.