인기있는 질문 인 것 같지만 답을 찾지 못했습니다.
숨겨진 파일을 포함하여 *를 통해 모든 파일을 다음과 같이 상위 디렉토리로 이동하는 방법 :
mv /path/subfolder/* /path/
이것은 예상대로 모든 파일을 상위 디렉토리로 이동하지만 숨겨진 파일은 이동하지 않습니다. 그렇게하는 방법?
인기있는 질문 인 것 같지만 답을 찾지 못했습니다.
숨겨진 파일을 포함하여 *를 통해 모든 파일을 다음과 같이 상위 디렉토리로 이동하는 방법 :
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 /path/subfolder/* /path/subfolder/.* /path/
두 명령을 하나로 결합하는 데 꼭 필요한 것은 아닙니다.
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
.
현재 디렉토리를 ..
나타내고 up
디렉토리를 나타냅니다 . 다른 모든 파일이 이동되었음을 확인해야합니다.
움직이려고하지 않기 때문에 이것이 가장 우아하다고 생각합니다 ..
.
mv /source/path/{.[!.],}* /destination/path
..anything
또는 ...anything
등 - stackoverflow.com/a/31438355/2351568은 이 문제에 대한 올바른 정규식이 포함되어 있습니다. || 그러나 어쨌든 사용하는 shopt -s dotglob
것이 여전히 더 나은 솔루션입니다!
{a,b}*
"anatomy"및 "bulldozer"와 같이 a 또는 b로 시작하는 모든 파일을 찾습니다. 두 번째 일치 항목은에 해당하는 빈 일치 항목이며 *
첫 번째 일치 항목은에 해당합니다 .[!.]
. 여기서 그룹 [!.]
은로 시작하지 않는 그룹을 의미합니다 .
. 이것은 의미 .*
하지만 아닙니다 ..*
.
이것은 예상대로 모든 파일을 상위 디렉토리로 이동하지만 숨겨진 파일은 이동하지 않습니다. 그렇게하는 방법?
다음을 켤 수 있습니다 dotglob
.
shopt -s dotglob # This would cause mv below to match hidden files
mv /path/subfolder/* /path/
을 사용 중지 dotglob
하려면 다음과 같이 말해야합니다.
shopt -u dotglob
man shopt
작동하지 않으며 help shopt
매우 간단합니다. 하지만 당신은 할 수있는 bashman () { man bash | less -p "^ $1 "; }
한 후 bashman shopt
똑 바르게 그것에 대해 모든 것을 읽을 수 있습니다. (shopt 내부로 시작하는 라인이 있다면 내가 발견, 명령에 아래로 이동하려면 n 공격해야 할 수도 있습니다.)
ls
.. 와 같은 다른 모든 명령에도 영향을 미칩니다 . 따라서 실제로 원하는 것은 아닙니다.
더 간단한 대안은 rsync
유틸리티 를 사용 하는 것입니다.
sudo rsync -vuar --delete-after --dry-run path/subfolder/ path/
참고 : 위의 명령은 변경 될 내용을 보여줍니다. 실제 변경 사항을 실행하려면--dry-run
.
장점은 원래 폴더 ( subfolder
)가 명령의 일부와 함께 제거된다는 것입니다. mv
여기에서 예제를 사용할 때 숨겨진 파일과 숨겨진 파일을 하나의 파일로 처리하기 위해 추가적인 골칫거리는 말할 것도없이 폴더를 정리해야합니다. 무늬.
또한 rsync
원격지간에 파일 복사 / 이동을 지원하며 파일이 원래 있던 그대로 복사되었는지 확인합니다 ( -a
).
used -u
매개 변수는 기존의 최신 파일을 건너 뛰고 -r
디렉토리로 재귀하며 -v
자세한 정보를 증가시킵니다.
sudo
및을 추가 --dry-run
했으므로 사람들은 잠재적 인 혼란을 피하기 위해 실제 명령을 실행하기 전에 변경 사항을 테스트 할 수 있습니다.
제 친구 "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
권한 유지를위한 것입니다.
것을 알 소스 경로가 끝나는되지 않는다/
(모든 그래서 파일 / 디렉토리. 파일이 복사됩니다)
/
소스 폴더의 내용을 전체적으로 대상에 배치하므로 대상 디렉토리는로 끝납니다 .
yes
은 대상 파일을 재정의하려는 경우 사용할 수있는 멋진 명령 이지만 항상 원하는 것은 아닙니다. 이 작업을 원하는 경우에만 사용하십시오. 또한, 사이에 차이가 yes | cp ...
및 cp -f ...
?
cp -r /path/to/source/. /destination