본문 바로가기
Developing/others

[ shell ] cp 혹은 mv 로 숨김파일 (.*) 까지 처리하기

by 콤쓰 2022. 11. 22.
$ ls -a
. .git Dockerfile node_modules tsconfig.json .. .github ENTRYPOINT.sh package.json yarn.lock .dockerignore .gitignore build public .eslintrc .prettierrc db.json src
$ cp -r {sourceDirectory}/* {destinationDirectory}

위 실행의 결과는 어떻게 될까요.

위 명령을 실행했을 때, 처음 (sourceDirectory)의 내용과 같은 상태가 출력될까요?

 

안됩니다.

이렇게 될 겁니다.

$ ls -a {destinationDirectory}
. Dockerfile node_modules tsconfig.json .. ENTRYPOINT.sh package.json yarn.lock build public db.json src
$

 

와일드카드를 이용해, 개별파일을 복사하거나 이동할 경우, '.'문자로 시작하는 숨김파일은 처리되지 않습니다.

숨김파일까지 처리하려면 어떤 방법을 써야할까요?

 

> 방법 1 ( bash로만 가능 )

더보기

bash에는 shopt( shell option )라는 커맨드가 있습니다. (zsh에는 없네요..?)

여기에서 각종 편의기능을 제공하는데, dotglob기능을 이용하면 됩니다. 

shopt -s dotglob # (turn on dot files)
## cp or mv any files with or without dot ##
shopt -u dotglob # (turn off dot files)

 

첫 줄의 커맨드로 .숨김파일이 글로벌하게 노출되고, 셋째 줄의 커맨드로 원래 상태로 되돌립니다.

그 사이에 와일드카드를 이용한 원하던 복사 이동 작업을 하면 되죠!

 

( 사실 새로운 bash환경을 열어서 작업을 수행했다면, 그냥 나가면 되기 때문에, 세 번 째 라인이 필요없죠. 개꿀! )

 

> 방법 2 ( 평-범 )

더보기

위의 방법은 깔끔하지만 굳이 bash로 가야하는 오묘한 귀찮음이 있습니다.

그냥 내가 쓰는 환경에서 대강 할 수는 없단 말인가?

여러 방법을 모색해 보았으나, 그럴 땐 이 방법이 그냥 최선인 것 같네요.

cp -r {sourceDirectory}/* {destinationDirectory}
cp -r {sourceDirectory}/.* {destinationDirectory}

넹.

두 번 작업하면 됩니다.

' . '을 명시한 와일드카드를 사용하면, 모든 숨김파일을 처리해 줍니다.

 

만약에 숨김폴더 안의 숨김폴더 안의 숨김파일같은 중첩된 숨김파일은 어떻게 되냐구요??

폴더를 통채로 옮기는 경우에는, 숨김파일까지 한 번에 완전히 옮겨집니다!

 

그 외에도 여러 기발한 방법들이(find를 사용한다거나..) 있지만, 실제 작업에 적용하기엔 무리가 있는 난해한 해답이란 생각이 드네요.

 

( 아래에 적어 둔 참고 페이지에는 제대로 작동하지 않는 각종 어설픈 답변들이 있으니 잘 걸러서 보시길 바랍니다. )

 

참고

https://superuser.com/questions/61611/how-to-copy-with-cp-to-include-hidden-files-and-hidden-directories-and-their-con