리눅스에서 숨겨진 파일과 서브 디렉토리를 복사하는 방법?


10

폴더 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 (일반 파일 포함)의 정확한 사본으로 끝납니다. 도움을 주시면 감사하겠습니다.

답변:


16

예를 들어 A 수준의 숨겨진 파일과 폴더 만 찾고 원하지 않는 한 (예 :

A/b/.hidden

복사하려면 다음을 사용할 수 있어야합니다.

cp -r A/.[^.]* B

그것은 기본적으로 a로 시작하는 모든 것을 복사 .한 다음 그 이외의 다른 문자를 .필터링하여 필터링 .하고..

편집 : Asker가 소유권, 날짜 등을 보존하고 싶다고 표시하지 않았기 때문에 cp 명령에서 -p를 제거했습니다.


이것은 질문에 주어진 예제 파일 및 디렉토리 이름에서 작동 하지만 질문 텍스트에 "숨겨진 파일 및 숨겨진 하위 디렉토리 (점으로 시작하는 디렉토리)"라고 표시 되며이 답변은 이름이 시작하는 파일 및 디렉토리를 찾지 못합니다 두 개의 점; 예를 들어, ..c.
Scott

그것은 매우 중요한 사건이지만, 그럼에도 불구하고 합법적 인 관심사입니다. 나는 그것을 고려하지 않았습니다. 로 전환하면이 .*[^.]를 설명 할 수 있지만로 끝나는 파일을 놓치게 .됩니다. 모든 경우를 진정으로 설명하기 위해서는 확장 된 글로브가 필요하다고 생각합니다.
Omnipresence

4

문제는 A/.*디렉토리 있다는 것입니다 .A또한 패턴과 일치한다.

확장 글로브 패턴을 켜고 다음을 사용할 수 있습니다.

shopt -s extglob
cp -r A/.!(?(.)) B    

이름이 점으로 시작하고 두 번째 문자가 점이 아니거나 아무것도 아닌 파일과 일치합니다 (? (.)는 아무것도 또는 점과 일치하지 않습니다!! (...)는 그것을 무시합니다. 아무것도 아니거나 점보다).


정답은 +1입니다. 참고 .!(@(|.))하나의 문자 이상 조금 명확 위 (IMNSHO)에 (AFAICT)와 동일합니다.
Scott

3

이와 같은 경우 다음과 같이 사용 find하는 것이 좋습니다 cp.

find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;

기본 구문은 다음과 같이 분류됩니다.

  • find A/ -type f: find디렉토리 A/대신 유형이 파일 인 디렉토리 의 항목 …
  • -maxdepth 1 -name '.*': maxdepth1 개 디렉토리 중 1 개에 대해 name시작합니다 ..
  • -exec cp -p {} B/ \;:이 파일을 찾으면 소스 ( )에서 대상 까지의 날짜 / 시간을 유지하기 위한 플래그가 exec있는 cp명령 입니다 .-p{}B/

maxdepth컨트롤 레이어를 추가하여 실수로 전체 파일 시스템을 복사하지 않도록하는 것을 좋아 합니다. 그러나 자유롭게 제거하십시오.


0
 for item in `find A -type d | grep -E "\."` ; do cp -r $item B ; done
  • find A -type d 디렉토리 만있는 A 내의 재귀 목록을 제공합니다.
  • grep -E "\." 점으로 디렉토리를 필터링합니다 (예 : 숨겨진 디렉토리)
  • -E 옵션은 "현재 디렉토리"를 의미하기 때문에 여기에 필요했습니다.
  • 백 슬래시는 정규 표현식에서 "모든 문자"의 의미를 피하는 것입니다.
  • cp -r 재귀 적으로 복사

A의 파일 및 폴더 구조를 만들고 Git Bash에서 명령을 실행했습니다 (지금은 Linux가 아닙니다).


파일 이름이나 경로에 공백이나 특수 문자가 있으면 중단됩니다.
slhck

주목 해 주셔서 감사합니다 :) 실제로 @gaboroncancio의 "테스트 사례"로 제한했습니다. 다른 테스트 배터리를 줄 수 있다면 개선을 시도 할 수 있습니다 (물론 원한다면이 응답을 편집하거나 새 응답을 만들어서 개선하십시오)
malarres

간단히 도트 파일을이라는 폴더에 넣을 수 있으며으로 A B확장되어 예기치 않게 작동합니다 cp -r A B/.dotfile B. 일반적인 조언은 전혀 파싱 find하거나 ls출력 하지 않는 것입니다. 을 사용하는 경우 find필터링 대신 자체 옵션을 사용해야 하며, 다른 곳에서 출력 grep을 파이프하는 find경우을 사용 -print0하거나 원하는 명령을 직접 호출하십시오. find 설명서를 참조하십시오 .
slhck

더 일반적으로, 파일로 작업 할 때 다른 답변에서 설명하는 것처럼 셸 글로브를 사용하는 것이 가장 안전합니다 (종종 extglob설정 해야 함).
slhck

링크 주셔서 감사합니다. find그런 다음 구문 분석을 그대로 두십시오 .
malarres

0

다른 방법으로 두 번째 문자가 영숫자 ( source ) 인 경우이 다른 명령을 사용할 수 있습니다 .

cp -r A/.[a-zA-Z0-9]* B

이것은 질문에 주어진 예제 파일 및 디렉토리 이름에서 작동 하지만 질문 텍스트에 "숨겨진 파일 및 숨겨진 하위 디렉토리 (점으로 시작하는 디렉토리)"라고 표시 되며이 답변은 이름이 시작하는 파일 및 디렉토리를 찾지 못합니다 점과 특수 문자; 예를 들어, .@foo또는 ..c.
Scott

그래서 두 번째 문자가 영숫자 인 경우 작동한다고 지적합니다. ;)
gaboroncancio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.