[linux] *를 통해 숨겨진 파일을 포함한 모든 파일을 상위 디렉토리로 이동하는 방법

인기있는 질문 인 것 같지만 답을 찾지 못했습니다.

숨겨진 파일을 포함하여 *를 통해 모든 파일을 다음과 같이 상위 디렉토리로 이동하는 방법 :

mv /path/subfolder/* /path/

이것은 예상대로 모든 파일을 상위 디렉토리로 이동하지만 숨겨진 파일은 이동하지 않습니다. 그렇게하는 방법?



답변

한 디렉토리에서 다른 디렉토리로 모든 파일 (숨김 포함)어떻게 이동합니까?에 대한 UNIX 및 Linux의 답변에서 이에 대한 포괄적 인 솔루션 세트를 찾을 수 있습니다 . . Bash, zsh, ksh93, 표준 (POSIX) sh 등의 솔루션을 보여줍니다.


다음 두 명령을 함께 사용할 수 있습니다.

mv /path/subfolder/* /path/   # your current approach
mv /path/subfolder/.* /path/  # this one for hidden files

또는 모두 함께 ( 감사합니다 pfnuesel ) :

mv /path/subfolder/{.,}* /path/

다음으로 확장됩니다.

mv /path/subfolder/* /path/subfolder/.* /path/

(예 :로 echo a{.,}b확장 a.b ab)

다음과 같은 몇 가지 경고가 표시됩니다.

mv: cannot move ‘/path/subfolder/.’ to /path/.’: Device or resource busy
mv: cannot remove /path/subfolder/..’: Is a directory

그냥 무시 : 때문에 발생 /path/subfolder/{.,}*도가 확장 /path/subfolder/./path/subfolder/..디렉토리와 상위 디렉토리있는, (참조 무엇을하고 “..”때 폴더에서 평균 “.”? ).


복사 만하려면 다음과 같이 사용하면됩니다.

cp -r /path/subfolder/. /path/
#                     ^
#                     note the dot!

이것은 /path/subfolder/.“이 디렉토리의 모든 것”으로 확장 되기 때문에 일반 파일과 숨겨진 파일 모두를 복사합니다 (출처 : 숨겨진 파일과 숨겨진 디렉토리 및 그 내용을 포함하기 위해 cp로 복사하는 방법? )


답변

움직이려고하지 않기 때문에 이것이 가장 우아하다고 생각합니다 ...

mv /source/path/{.[!.],}* /destination/path


답변

이것은 예상대로 모든 파일을 상위 디렉토리로 이동하지만 숨겨진 파일은 이동하지 않습니다. 그렇게하는 방법?

다음을 켤 수 있습니다 dotglob.

shopt -s dotglob               # This would cause mv below to match hidden files
mv /path/subfolder/* /path/

을 사용 중지 dotglob하려면 다음과 같이 말해야합니다.

shopt -u dotglob


답변

더 간단한 대안은 rsync유틸리티 를 사용 하는 것입니다.

sudo rsync -vuar --delete-after --dry-run path/subfolder/ path/

참고 : 위의 명령은 변경 될 내용을 보여줍니다. 실제 변경 사항을 실행하려면--dry-run .

장점은 원래 폴더 ( subfolder)가 명령의 일부와 함께 제거된다는 것입니다. mv여기에서 예제를 사용할 때 숨겨진 파일과 숨겨진 파일을 하나의 파일로 처리하기 위해 추가적인 골칫거리는 말할 것도없이 폴더를 정리해야합니다. 무늬.

또한 rsync원격지간에 파일 복사 / 이동을 지원하며 파일이 원래 있던 그대로 복사되었는지 확인합니다 ( -a).

used -u매개 변수는 기존의 최신 파일을 건너 뛰고 -r디렉토리로 재귀하며 -v자세한 정보를 증가시킵니다.


답변

제 친구 “dotglob”을 소개하겠습니다. “*”에 숨겨진 파일이 포함되어 있는지 여부를 켜고 끕니다.

$ mkdir test
$ cd test
$ touch a b c .hidden .hi .den
$ ls -a
. ..  .den  .hi .hidden a b c

$ shopt -u dotglob
$ ls *
a b c
$ for i in * ; do echo I found: $i ; done
I found: a
I found: b
I found: c

$ shopt -s dotglob
$ ls *
.den  .hi .hidden a b c
$ for i in * ; do echo I found: $i ; done
I found: .den
I found: .hi
I found: .hidden
I found: a
I found: b
I found: c

기본값은 “off”입니다.

$ shopt dotglob
dotglob         off

완료되면 다시 켜는 것이 가장 좋습니다. 그렇지 않으면 꺼질 것이라고 가정하는 일을 혼동하게됩니다.


답변

find명령과 함께 명령 을 사용하면 명령이 디렉토리 (예 : 및 ) 및 하위 디렉토리를 이동 mv하지 못하도록 할 수 있습니다 . 다음은 한 가지 옵션입니다.mv...

find /path/subfolder -maxdepth 1 -type f -name '*' -exec mv -n {} /path \;

제공된 다른 답변 중 일부에 문제가 있습니다. 예를 들어, 다음은 각각 소스 경로에서 하위 디렉터리를 이동하려고합니다.

1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/
2) mv /path/subfolder/{.,}* /path/
3) mv /source/path/{.[!.],}* /destination/path

또한 2)에는. 및 .. 파일 및 3) ..foobar, … barfoo 등과 같은 파일이 누락되었습니다.

mv /source/path/{.[!.],..?,}* /destination/path3)에서 누락 된 파일을 포함 하는를 사용할 수 있지만 여전히 하위 디렉토리를 이동하려고 시도합니다. 위에서 설명한대로 find명령과 함께 명령을 사용하면 mv이러한 모든 문제가 제거됩니다.


답변

권한을 유지 하는 대상 디렉터리에 모든 파일 ( .파일 포함 )을 복사 해야 할 때이 문제에 대한 내 해결책 은 다음과 같습니다. (이미 존재하는 경우 덮어 쓰기)

yes | cp -rvp /source/directory /destination/directory/

yes대상 파일을 자동으로 덮어 쓰고,
r재귀 적,
v상세 정보,
p권한 유지를위한 것입니다.

것을 알 소스 경로가 끝나는되지 않는다/ (모든 그래서 파일 / 디렉토리. 파일이 복사됩니다)

/소스 폴더의 내용을 전체적으로 대상에 배치하므로 대상 디렉토리는로 끝납니다 .