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


113

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

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

mv /path/subfolder/* /path/

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


1
이 질문은이 SU에서 중복을 더욱 정답 (안 비록 허용 한)으로, : cp -r /path/to/source/. /destination
플로리안

답변:


202

한 디렉토리에서 다른 디렉토리로 모든 파일 (숨김 포함)어떻게 이동합니까?에 대한 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로 복사하는 방법? )


2
중괄호는의 단축키 일 뿐이며 mv /path/subfolder/* /path/subfolder/.* /path/두 명령을 하나로 결합하는 데 꼭 필요한 것은 아닙니다.
chepner 2013

7
다음과 같은 오류가 발생합니다.mv: overwrite `/path/.'? y mv: cannot move `/path/subfolder/.' to `/path/.': Device or resource busy mv: overwrite `/path/..'? y mv: cannot move `/path/subfolder/..' to `/path/..': Device or resource busy
Dejan

@Dejan 그냥 무시하십시오. .현재 디렉토리를 ..나타내고 up디렉토리를 나타냅니다 . 다른 모든 파일이 이동되었음을 확인해야합니다.
Debiprasad

가치 중괄호가 모든 쉘에 대한 작동하지만 @chepner 명령은 내가 그것을 것이라고 생각합니다 바로 가기 것을 언급
헤수스 카레라

7
"그냥 경고를 무시하십시오"가 항상 좋은 생각은 아닙니다. 지금 당장은 단계가 실패하면 실행을 중지해야하는 스크립트에 문제가 있습니다.이 솔루션은 항상 오류를 일으키기 때문에 스크립트를 종료합니다. 뮤직 비디오 명령이 실패인지 아닌지 나는 ... 확인하는 방법이 필요합니다
MarioVilas

29

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

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

1
예, 그 오류 메시지도 제공하는 것으로 나타났습니다.
Joseph Astrahan

나는 이것이 아주 좋은 해결책이라고 생각하지만 그 패턴을 기억하는 것이 좀 어렵다
딜런 B

이 같은 파일을 놓칠 ..anything또는 ...anything등 - stackoverflow.com/a/31438355/2351568은 이 문제에 대한 올바른 정규식이 포함되어 있습니다. || 그러나 어쨌든 사용하는 shopt -s dotglob것이 여전히 더 나은 솔루션입니다!
DJCrashdummy

@DylanB는 그것을 암기하지 마십시오. 쉼표로 구분 된 중괄호 안에있는 모든 항목과 일치합니다. {a,b}*"anatomy"및 "bulldozer"와 같이 a 또는 b로 시작하는 모든 파일을 찾습니다. 두 번째 일치 항목은에 해당하는 빈 일치 항목이며 *첫 번째 일치 항목은에 해당합니다 .[!.]. 여기서 그룹 [!.]은로 시작하지 않는 그룹을 의미합니다 .. 이것은 의미 .*하지만 아닙니다 ..*.
mazunki

28

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

다음을 켤 수 있습니다 dotglob.

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

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

shopt -u dotglob

매우 유용합니다. 더 많은 것을 알고 싶었지만 shopt는 내장 기능이므로 man shopt작동하지 않으며 help shopt매우 간단합니다. 하지만 당신은 할 수있는 bashman () { man bash | less -p "^ $1 "; }한 후 bashman shopt똑 바르게 그것에 대해 모든 것을 읽을 수 있습니다. (shopt 내부로 시작하는 라인이 있다면 내가 발견, 명령에 아래로 이동하려면 n 공격해야 할 수도 있습니다.)
닉 라이스

2
이것은 ls.. 와 같은 다른 모든 명령에도 영향을 미칩니다 . 따라서 실제로 원하는 것은 아닙니다.
phil294

5

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

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

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

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

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

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


최고의 솔루션! 제 경우에는 루트 폴더를 업데이트하고 싶지 않기 때문에 -u 매개 변수를 제거했습니다. 감사합니다
Thales Ceolin

이것은 당신이 조심하지 않으면 리눅스에서 영구적으로 자신을 위해 일을 망칠 수있는 명령 중 하나입니다. rsync 명령 전에 sudo를 포함하도록 답변을 업데이트하십시오. 그렇지 않으면 사용자가 mkdir에 대한 Permission Denied를 쉽게 얻을 수 있지만 파일 삭제는 계속 진행되므로 rsync 명령은 이동하려는 전체 디렉토리를 삭제하고 다른 작업은 수행하지 않습니다. . 전체 디렉토리를 잃게됩니다. 대답에 sudo를 추가하면 아마도 이것이 허용되는 대답이 될 것입니다. 따라서 명령은 다음과 같아야합니다. sudo rsync -vuar --delete-after path / subfolder / path /
Blue Water

@JohnnyB 불편을 드려 죄송합니다. 나는 sudo및을 추가 --dry-run했으므로 사람들은 잠재적 인 혼란을 피하기 위해 실제 명령을 실행하기 전에 변경 사항을 테스트 할 수 있습니다.
kenorb

오, 드라 이런 옵션이 있다는 것을 몰랐습니다. 좋은 추가. 사과 할 필요가 없습니다. 이것은 훌륭합니다.
Blue Water

3

제 친구 "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

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


3

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이러한 모든 문제가 제거됩니다.


2

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

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

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

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

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


while yes은 대상 파일을 재정의하려는 경우 사용할 수있는 멋진 명령 이지만 항상 원하는 것은 아닙니다. 이 작업을 원하는 경우에만 사용하십시오. 또한, 사이에 차이가 yes | cp ...cp -f ...?
mazunki
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.