숨겨진 파일을 이동시키기 위해 mv (또는 * 와일드 카드)를 얻으려면 어떻게해야합니까?


133

홈 디렉토리를 오래된 시스템에서 새로운 시스템으로 마이그레이션하고 있으며, tarball에는 .bashrc와 같은 숨겨진 파일을 포함하여 모든 것이 포함되어 있습니다. 그러나 압축 해제 된 tarball (/ tmp에있는)의 내용을 새 홈 디렉토리로 이동하면 숨겨진 파일이 복사되지 않습니다 ( mv /tmp/home/rcook/* /home/rcook/). mv가 어떻게 그들을 움직일 수 있습니까?

실제로, 문제는 mv가 아니라 bash의 globbing과 관련이 있다고 생각합니다. 내가 이렇게하면 :

mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/

나는 이것을 본다 :

a/:
.  ..  .foo

b/:
.  ..  bar

a/.foo움직이지 않았다. 그렇다면 숨겨진 파일을 찾기 위해 와일드 카드를 어떻게 얻을 수 있습니까?

예, tarball을 내 홈 디렉토리로 직접 압축 해제 할 수 있지만 tarball은 압축을 풀고 이전의 사용자 정의 버전으로 home/rcook/...새 파일 .bashrc등을 덮어 쓰고 숨겨진 파일을 찾고 이동하는 방법을 알고 싶습니다 . 가치있는 기술입니다. 제안?


일부 답변은와 같은 것을 제안 mv src/.* dest/합니다. 그러나 테스트 디렉토리에서 시도했지만 오류가 발생했습니다. 로 시작:

rcook$ ls -a a/ b/
a/:
.  ..  bar  .foo

b/:
.  ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
.  ..  bar

b/:
.  ..  .foo

내가 무엇을 잘못하고 있지?


답변:


146

당신은 이것을 할 수 있습니다 :

shopt -s dotglob
mv /tmp/home/rcook/* /home/rcook/

당신은 넣을 수 있습니다

shopt -s dotglob

당신에 ~/.bashrc당신은 그것을 기본으로합니다.

http://mywiki.wooledge.org/glob를 참조 하십시오


도트 파일을 복사하는 다른 방법 :

mv /tmp/home/rcook/.[!.]* /home/rcook/

..*일치 하는 패턴 을 사용하지 마십시오 ..(부모 디렉토리에 대한 포인터). 이름이 두 개의 점 ( ..something)으로 시작하는 파일이 있으면 패턴도 사용하십시오 ..?*.


질문 맨 아래에 추가 한 내용을 확인하십시오. 감사.
랜달 쿡

1
잘못의 속삭임, .그리고 ..각각 : 스페셜 DIRS있는 현재의 디렉토리부모 디렉토리를 . 경고 일뿐입니다. 더 나은 사용 shopt -s dotglob솔루션
Gilles Quenot

나는 단지 두 가지 움직임을 mv home/rcook/* /home/rcook/겪었다 mv home/rcook/.* /home/rcook/. 나는 트릭을 수행했지만 링크를 따라 가서 먼저 dotglob 모드에 대해 읽었기를 바랍니다. 한 걸음 더 나아 갔을 것입니다. +1
랜달 쿡

두 번째 방법은 절대 경로를 사용해야합니까?
franzlorenzon

3
당신이 사용하는 경우 zsh, 당신은 사용할 수 있습니다 글 로빙 규정 또는 쉘 옵션을 . DGLOB_DOTS
mgalgs

43

추가로 오류가 발생했지만 코드는 여전히 작동했습니다. 추가해야 할 유일한 점은 도트 파일을 복사 하라는 것 입니다. 시험:

mv src/* src/.* dst/

에 대한 오류가 계속 발생합니다. 그리고 .. 항목, 괜찮습니다. 그러나 이동은 성공해야합니다.

~/scratch [andrew] $ mv from/* from/.* to/
mv: cannot move from/.’ to to/.’: Device or resource busy
mv: cannot remove from/..’: Is a directory
~/scratch [andrew] $ ls -a from/ to/
from/:
.  ..

to/:
.  ..  test  .test

1
좋은 점, @AndrewSchwartz. 나도이 접근법을 좋아한다. 더 인정받을 만하다고 생각합니다.
랜달 쿡

@Drake Clarris가 조금 더 대답하는 것을 좋아합니다 .Amazon AWS CodeBuild에서 실행 중이고 0이 아닌 반환 코드로 인해 실제로 빌드가 중지 되었기 때문입니다. 나는 .hidden내 문제를 해결하기 위해 명시 적으로 하나의 파일을 이동 하게되었습니다.
HeyWatchThis

0이 아닌 종료 코드가 문제인 경우 추가하여 || :( 예 : ||false / error에서 다음을 실행하는 :것은 noop 명령 임) 이를 억제 할 수 있습니다. 그러나 이는 대상 폴더가 존재하지 않는 등의 정당한 오류도 억제합니다. 및 항목 mv을 제외시키는 데 더 우아한 방법을 찾을 수 없습니다 . cp 이상의 저에게 큰 장점은 디스크에 새 파일을 쓰지 않습니다. ...
앤드류 슈워츠

10

ls -l디렉토리에있는 경우 ...나열된 파일이 표시됩니다. 그래서 나는 mv .* /dest그 포인터를 고려 한다고 생각 합니다. 시험:

mv /tmp/home/rcook/{*,.[^.]*,..?*} /home/rcook/

이것은 현재 및 부모 디렉토리 포인터를 무시합니다.

당신은 세 가지 패턴이있는 경우 오류가 발생합니다 *, [^.]*또는 ..?*아무 파일과 일치하지 않습니다, 그래서 당신은 일치하는 사람 만이 포함되어야한다.


좋은. 이 스타일의 globbing에 대한 비슷한 대답은 다음과 같습니다. superuser.com/a/784046/144977 . 게시 해 주셔서 감사합니다.
phyatt

7

내가 생각할 수있는 두 가지 가능한 솔루션. 첫 번째는 재귀 옵션과 함께 cp를 사용하여 현재 디렉토리를 대상에 복사하는 것입니다.

cp -Rp . /desired/directory

그런 다음 현재 디렉토리에서 소스 파일을 제거 할 수 있습니다

또는 파일의 이름이 공백 (와일드 카드, 인쇄 할 수없는 문자 없음) 인 경우 다음과 같이 할 수 있습니다.

mv $(ls -A) /desired/directory

4
복사 후 제거는 소스와 대상이 동일한 파일 시스템에있는 경우 이동과 매우 다릅니다. -p메타 데이터를 유지 하는 옵션 을 최소한 포함하십시오 . 사용 ls하는 것이 최후의 수단이어야하며 여기에는 더 좋고 간단한 방법이 있습니다.
Gilles

2

Linux에는 실제로 "숨겨진"파일이 없습니다. 점으로 시작하는 파일은 기본적으로 파일 목록에서 숨겨집니다.

심지어 글로브와 파일을 복사하려면, 당신은을 사용하여 파일 접두사 필요 .등을 mv -u .* foo다음 .foo과 같이 appearn 것 foo/.foo움직일 때.

-u 옵션은 소스가 최신이거나 대상이 누락 된 경우에만 파일을 이동합니다. 또는 당신은 단지 이동에 대한 오류를 무시할 수 ...그들이 특수 파일이며, 이동 될 수는 없지만, 할로에 잡힐 .*쉘에 의해 글로브.


질문 맨 아래에 추가 한 내용을 확인하십시오. 감사.
랜달 쿡

0

그래서 우리는 :

a
|-- .foo
`-- bar

과:

b

여기에있는 모든 답변보다 더 나은 솔루션을 찾는 데 시간 이 걸렸습니다 .

그런 다음 이 명령에 30 초가 걸렸습니다 .

$ mv --help

그런 다음 내 사랑을 찾았습니다.

$ mv a/ b/ -T

참고 : 나는 심지어 인수를 이해하지 못합니다 -T. 방금 내가 필요한 것을했습니다. 여기에 말한다 :

-T, --no-target-directory 는 DEST를 일반 파일로 취급합니다.


1
슬래시를 생략하면 필요하지 않습니다 -T. 어느 쪽이든 이것은 기본적으로 mv에게 모든 파일을 내부에서 옮기지 않고 디렉토리 자체를 옮기라고 지시합니다.
thomasrutter

@thomasrutter, 디렉토리 자체를 이름을 바꾸는 것과 같은 것이 아닌가?
랜달 쿡

3
예, 부모 목적지가 동일하게 유지되면 본질적으로 이름을 바꾸는 것입니다. 그러나 당신은 그것을 참고할 것입니다. 아마도 디렉토리 안의 파일을 주어진 위치로 옮기는 것에 관한 원래의 질문에 대답하는 데 도움이되지 않을 것입니다 .
thomasrutter

0

제 경우에는 단순히 mv하나의 숨겨진 파일을 찾으려고 노력 했으며 이것이 해결책이었습니다.

FILE=.myHiddenFile
mv "$FILE" dest/

설명

처음에 나는 노력하고 있었다 :

mv .myHiddenFile dest/

그러나 계속 오류가 발생했습니다.

mv: cannot stat '.myHiddenFile': No such file or directory

비록 ls -al파일을 보여 주었고 dest/존재했습니다.

쉘이 "."을 해석했기 때문입니다. 파일 이름에서 변수로 이동하면 해석을 피할 수 있습니다. 이 문제를 해결하는 다른 방법이있을 수 있지만 이것은 우리에게 충분했습니다.


-1

숨겨진 파일을 포함한 파일을 현재 디렉토리에 복사하려는 경우.

cp -Rp source-directory/. .

1
이것은 2013 년 Drake Clarris의 답변과 매우 유사합니다. 추가해야 할 것이 있습니까?
랜달 쿡
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.