숨겨진 파일을 이동시키기 위해 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.