[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/path
3)에서 누락 된 파일을 포함 하는를 사용할 수 있지만 여전히 하위 디렉토리를 이동하려고 시도합니다. 위에서 설명한대로 find
명령과 함께 명령을 사용하면 mv
이러한 모든 문제가 제거됩니다.
답변
권한을 유지 하는 대상 디렉터리에 모든 파일 ( .
파일 포함 )을 복사 해야 할 때이 문제에 대한 내 해결책 은 다음과 같습니다. (이미 존재하는 경우 덮어 쓰기)
yes | cp -rvp /source/directory /destination/directory/
yes
대상 파일을 자동으로 덮어 쓰고,
r
재귀 적,
v
상세 정보,
p
권한 유지를위한 것입니다.
것을 알 소스 경로가 끝나는되지 않는다/
(모든 그래서 파일 / 디렉토리. 파일이 복사됩니다)
/
소스 폴더의 내용을 전체적으로 대상에 배치하므로 대상 디렉토리는로 끝납니다 .