폴더 A의 숨겨진 파일과 숨겨진 하위 디렉터리(점으로 시작하는 디렉터리)를 폴더 B로 복사하는 방법은 무엇입니까? 예를 들어 다음과 같은 구조가 있는 경우:
A/a
A/b
A/.a
A/.b/
A/.b/somefile
A/.b/.c
A의 숨겨진 파일과 숨겨진 하위 디렉터리만 B에 복사하고 싶습니다.
B/.a
B/.b/
B/.b/somefile
B/.b/.c
cp A/.* B
나는 이미 다음 명령을 시도했습니다.이 다른 슈퍼유저 질문. 그러나 하위 디렉터리는 복사되지 않습니다. 또한 시도했지만 cp -r A/.* B
복사 .
되므로 A의 정확한 복사본(일반 파일 포함)으로 끝납니다. 도움을 주시면 감사하겠습니다.
답변1
예를 들어 A 수준의 숨겨진 파일과 폴더만 찾고 싶지 않다면
A/b/.hidden
복사하려면 다음을 사용할 수 있어야 합니다.
cp -r A/.[^.]* B
이는 기본적으로 a로 시작하는 모든 문자를 복사 .
한 다음 a 이외의 문자를 .
필터링하여 복사하는 것을 의미합니다 .
...
편집: Asker가 소유권, 날짜 등을 보존하고 싶다고 표시하지 않았기 때문에 cp 명령에서 -p를 제거했습니다.
답변2
문제는 패턴과 일치하는 디렉터리 A/.*
가 있다는 것입니다 ..
A
확장된 glob 패턴을 켜고 다음을 사용할 수 있습니다.
shopt -s extglob
cp -r A/.!(?(.)) B
이름이 점으로 시작하고 두 번째 문자가 점도 아니고 아무것도 아닌 파일과 일치합니다( ?(.) 는 아무것도 일치하지 않거나 점과 일치하고, !(...) 는 이를 부정합니다. 즉 !(?(.)) 는 다른 모든 것과 일치합니다. 아무것도 없거나 점보다).
답변3
이와 같은 경우에는 다음을 사용하는 것이 좋습니다.find
대신에cp
이와 같이:
find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;
기본 구문은 다음과 같이 분류됩니다.
find A/ -type f
: 유형이 파일인(디렉토리 대신)find
디렉토리의 항목 …A/
-maxdepth 1 -name '.*'
maxdepth
: 1개의 디렉토리 중 으로name
시작하는 에 대한 내용입니다.
.-exec cp -p {} B/ \;
: 그리고 이러한 파일이 발견되면 소스( )에서 대상까지 날짜/시간을 보존하는 플래그 와 함께 명령이 실행exec
됩니다 .cp
-p
{}
B/
maxdepth
나는 실수로 전체 파일 시스템을 복사하지 않도록 제어 계층을 추가하는 데 사용하는 것을 좋아합니다 . 하지만 자유롭게 제거하세요.
답변4
대안으로 두 번째 문자가 영숫자(원천):
cp -r A/.[a-zA-Z0-9]* B