현재 디렉토리에서 상위 디렉토리로 모든 파일을 이동하는 방법은 무엇입니까?


133

리눅스에서 현재 디렉토리의 모든 파일을 상위 디렉토리로 옮기는 방법은 무엇입니까?

과 같은 것을 시도했지만 mv *.*작동하지 않습니다.


질문에 태그를 다시 지정할 충분한 담당자가 없지만 [linux] [mv] [cwd] [files], 또는 이와 유사한 것을 제안 할 수 있습니까?
Stephan202

Stephan202의 요청에 따라이 질문에 다시 태그를 달았습니다.
eleven81

답변:


202

당신이 찾고있는 명령은

mv * .[^.]* ..

또는 (자세한 내용은 아래 참조) :

(shopt -s dotglob; mv -- * ..)

설명 : mv명령이 파일 및 디렉토리를 이동합니다. 에 대한 마지막 인수 mv는 대상입니다 (이 경우 디렉토리에서 디렉토리의 한 단계 "업" ..). 그 이전의 인수는 소스 파일과 디렉토리입니다. 별표 ( *)는 점으로 시작하지 않는 모든 파일과 일치하는 와일드 카드입니다. 점 (점 파일)으로 시작하는 파일은 "숨겨집니다". 패턴을 사용하여 일치시킵니다 .[^.]*(아래 편집 참조).

에 대한 자세한 내용은 내가 연결 한 맨 페이지를 참조하십시오 mv.


.[^.]*대신에 .*?

크리스 욘센이 정확하게 지적 : 패턴 .*도 일치 .하고 ... 그것들을 옮기고 싶지 않으며 움직일 수 없기 때문에 두 개를 제외한 점으로 시작하는 파일 이름과 일치하는 패턴을 사용하는 것이 좋습니다 . 패턴 .[^.]*은 다음을 수행합니다. 점 (2)으로 시작하고 그 뒤에 점 (3) 이 아닌 문자 뒤에 0 개 이상의 임의의 문자가 오는 파일 이름 (1)과 일치합니다 .

으로 Paggas는 지적 , 우리는 또한 패턴을 추가해야 할 것 .??*두 개의 점으로 시작하는 파일과 일치하기 위해. 를 사용하는 대체 솔루션에 대한 그의 답변을 참조하십시오 find.

Arjan의 대답shopt 은 도트 파일과 관련된 모든 문제를 피하기 위해 언급 했습니다. 그러나 대시로 시작하는 파일에는 여전히 문제가 있습니다. 그리고 세 가지 명령이 필요합니다. 아직도, 나는 그 아이디어를 좋아한다. 나는 이것을 다음과 같이 사용할 것을 제안한다.

(shopt -s dotglob; mv -- * ..)

이것은 shopt서브 쉘에서 실행 되므로 (두 번째 호출이 shopt필요 --하지 않음) 대시로 시작하는 파일이에 대한 인수로 해석되지 않도록 사용합니다 mv.


7
사용 .*발생할 수 있습니다 MV를 이동 할 수 없다는 대해 경고 / 오류를 생산 .하고 ... mv * .[^.]* ..대신 시도해보십시오 .
Chris Johnsen

1
@alain : 천만에요, 사이트에 오신 것을 환영합니다! (여기서 게시물 중 하나가 귀하의 질문에 충분히 답변했다면, 그렇게 표시 할 수 있습니다. 포스터에 15 점의 추가 평판을 얻고 2 명의 담당자를 추가로 제공합니다.)
Stephan202

나는 서브 쉘에서 실행되는 shopt 솔루션을 정말로 좋아한다 :)
Paggas

2
chmod 및 chown 및 "recurse"플래그 (예 : chmod -R 또는 chown -R)와 함께 사용하는 경우에만 ..을 포함하여 *. * 구문에는 아무런 해가 없습니다. 그리고 그 경우에, 지금까지없는 지금 .. * 또는 chmod를 대한 Chown을 입력 * - 대한 Chown 경로의 최상위 디렉토리 당신이 찾고있는과 (심볼릭 링크를 따르지 않는) -h 사용합니다. 그러나 mv ..는 단순히 아무것도하지 않으므로 걱정하지 마십시오.
chris

1
올바른 세 가지 패턴이있다 *, .[^.]*하고 ..?*. 두 번째 .[!.]*는 구형 (POSIX) 쉘일 수 있습니다. 또한 읽으십시오

42

짧은 대답 : 사용

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

긴 대답 :

명령

mv * .* ..

이후 작동하지 않습니다 .*일치시킬 수 있습니다 .... 그러나 명령

mv * .[^.]* ..

.[^.]*예를 들어, 일치하지 않기 때문에 작동 하지 않습니다 ..filename! 대신 내가하는 일은

mv * .[^.] .??* ..

이는 제외한 모든 일치 .하고 ... *로 시작하지 않는 모든 것을 일치 ., .[^.]제외 점으로 시작하는 모든이 문자 파일 이름을 일치 ..하고, .??*최소 3 자에 점으로 시작하는 모든 파일 이름과 일치합니다.

더 나은 아직, 당신은 사용할 수 있습니다

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

추악한 글로브 해킹을 피할 수 있습니다 mv * .[^.] .??* ..!


1
또한 명령이 대시로 시작하는 파일 이름과 올바르게 작동하도록-의 중요성을 잊어 버렸습니다. 나는 찾기 답변에 포함시켰다. globs를 사용하는보다 완전한 대답은 "mv-*. [^.]. ?? * .."입니다.
Paggas

+1 : ..?*댓글로 돌아 가기 위해 돌아 왔는데 이미 처리 했었습니다.
Chris Johnsen

1
mv ..를 시도 할 때 무엇이 ​​잘못 될 수 있습니까? 그것은 단순히 아무것도하지 않으며 아무것도 할 수 없습니다. 무언가를 할 있는 다른 명령이 있지만 (chmod 및 chown) mv 및 rm은 단순히 아무것도하지 않습니다.
chris

1
이것은 mv : illegal option-t
pal4life를 제공합니다

1
Bono, 이중 대시는 mv추가 명령 옵션을 찾지 않도록 지시 합니다. 중괄호는 결과 파일 이름입니다. 더하기 부호는 결과 당 (예 : 파일 이름 당) exec를 실행하는 대신 가능한 한 단일 exec에 많은 결과를 넣습니다. 완전성을 -t..위해 대상 대상을 이동하여 이러한 모든 파일을 이동시키는 것입니다.
isuldor

14

완전성을 위해 Bash 쉘에 다음을 사용하여 숨겨진 파일을 포함하도록 지시 할 수도 있습니다 shopt.

shopt -s dotglob
mv -- * ..
shopt -u dotglob

+1. 훨씬 더 깨끗합니다. 그래도 약간의 개선이 필요하다고 생각합니다. 내 답변에 대한 업데이트를 참조하십시오.
Stephan202

8

mv는 *사용할 때 숨겨진 파일을 이동하는 기능이 없습니다. 대신 복사를 사용하지 않는 이유는 무엇입니까?

cp -rf . ..

rm -rf *

도트 글 로빙과 찾기 명령을 사용하여 복잡한 솔루션을 사용할 필요가 없습니다.


경고 동일한 파일 시스템 으로 이동 하는 경우 대부분의 경우 실제로 파일을 복사하지 않고 inode 또는 파일 내용을 이동하지 않고 디렉토리 항목 만 업데이트합니다. [1 ] 도 참조하십시오 . A를 cp하고 rm대신에 당신은 정말 모두를 복사합니다.
Hastur

6
rsync -a --remove-source-files . ..

rsync 매우 효율적인 파일 복사 도구로, 일반적으로 효율적인 증분 원격 백업 및 미러를 수행하는 데 사용됩니다.

위의 명령으로 rsync내용 ...

이 스위치 -a.하위 디렉토리 로의 재귀를 활성화하고 다른 공통 옵션을 활성화합니다.

스위치 --remove-source-files는 복사 성공 후 소스 파일을 제거하도록 rsync에 지시합니다. 즉, rsync가 mv명령 과 유사하게 작동합니다 .


1
조금 더 설명하면 좋을 것입니다.
ChrisF

물론 더 명확 해지기를 바랍니다.
mrucci

그 주 --remove-source-files(동기화) 디렉토리를 제거하지 않습니다.
Dennis

좋아, 받아 들여진 해결책은 나에게 -bash: /bin/mv: Argument list too long오류를 준다 . 이것은 매력처럼 작동합니다.
userlond

2

mv .mv는 현재있는 디렉토리를 링크 해제 할 수 없기 때문에 궁극적으로 시도 가 실패 mv * ..합니다. cwd에서 파일을 이동할 수 있습니다.


2
mv * .??* ../.

*모든 비 도트 파일을 가져옵니다. .??*모든 것을 얻는다. 최소 3 바이트 길이의 파일로 모든 합법적 인 파일에 적용됩니다. 어쨌든 당신이 원하는 것은 아마도 rm남았을 것 mv입니다.

이 프로그램 ../.은 직접적인 이점을 제공하지는 않지만 ..디렉토리로 이동하면 경로에 문제가있는 경우 원하는대로 실패하기 때문에 들어가는 것이 좋습니다. 예를 들어 mv xyz bletch, 어디 생각 bletch 디렉토리입니다, 더 특정 할 수있다 mv xyz bletch/..


2
.[^.]와 같은 표지 파일을 얻기 위해 추가 할 수 있습니다 .a.
Chris Johnsen

../와 ../ 사이에는 차이가 없습니다. 그래서을 입력하는 것을 귀찮게하지 않을 것입니다. 슬래시 후. 또한 mv 및 rm의 경우을 포함해도 아무런 해가 없습니다. 그리고 .. 목록에서, 즉 rm과 같이 mv *. * / path / to / file /에는 무섭거나 잘못된 것이 없습니다. 또는 -rf 아무것도하지 않습니다.
chris

2

이 최소화 된 명령은 대부분의 최신 쉘에서 작동합니다.

\mv -- {,.{[^.],??}}* ..

그렇지 않으면 휴대용 솔루션이 언급됩니다.

\mv -- * .[^.] .??* ..

풍모:

  1. \는 별칭이 mv를 바람직하지 않게 변경하지 못하게합니다.

  2. -하이픈 (-xyz)을 포함하는 파일 이름이 명령 줄 인수로 해석되지 않도록합니다.

  3. . [^.]는로 시작하는 두 문자 파일 이름과 모두 일치합니다. .. 제외

  4. . ?? *는 다른 모든 파일 이름을 3 자 이상 일치시킵니다.

순진한 구현 :

  1. 다음은로 시작하는 숨겨진 UNIX 파일 이름을 건너 뜁니다. (.bashrc).

    mv * ..
    
  2. 다음은 .. 일치하여 모든 디렉토리를 재귀 적으로 현재 작업 디렉토리 ($ PWD 또는 pwd)의 /. 절대 사용하지 마십시오.

    mv .* ..
    

2

이 패턴을 사용하는 것이 더 맞습니다 * .[!.] .??*보다 * .[^.] .??*전자는 또한 ksh88과 같은 오래된 조개와 함께 작동하기 때문에 :

mv -- * .[!.] .??* ..
  • -- 다음으로 시작하는 파일 이름이있을 때 문제를 방지합니다 -
  • * 로 시작하지 않는 모든 파일 이름과 일치 .
  • .이동할 수 있거나 움직여야 하는 문자 파일 이름이 없습니다.
  • .[!.] 로 시작하는 두 문자 파일 이름과 모두 일치 .
  • .??* 로 시작하는 세 문자 파일 이름 (또는 그 이상)과 모두 일치 .

ksh88을 사용하면 파일 이름 패턴 .[^.]은 실제로는 ..항상 존재 하는 파일 이름 과 .^존재하지 않는 파일 이름과 일치하여 원하는 것과 반대의 영향을 미칩니다.


0

작업을 찾아서 grep하십시오. find 및 egrep을 수정하여보다 복잡한 기준으로 파일을 선택하려는 경우 이러한 종류의 구조가 도움이 될 수 있습니다.

find -maxdepth 1 | egrep '^./.'         # Returns all files

mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..

0

모든 파일을 부모 디렉토리로 옮기는 가장 쉬운 해결책이라고 생각합니다. 될 것이다

mv "`ls`" ../

또는 숨겨진 파일 / 디렉토리가있는 경우

사용하다:

mv "`ls -a`" ../ 2>/dev/null

또한 일부 폴더의 내용을 내부 폴더 중 하나로 옮기고 싶다고 말하십시오.

사용하다:

mv "`ls -a`" /tony 2>/dev/null

노트 :

"`ls -a`" 

공백이있는 파일을 이동합니다.

2>/dev/null

및 폴더를 ls -a인쇄하고 이동하거나 복사 할 수 없으므로 경고 / 오류를 억제하기위한 것입니다. 따라서 해당 폴더의 경우 2> / dev / null을 사용하지 않으면 폴더를 이동할 수 없으며 나머지는 매우 편안하게 이동한다는 오류가 표시됩니다....

ls -a숨겨진 파일이없는 경우 피하고 사용하십시오 ls.


달릴 때 어떤 일이 일어 날까 mv $(ls -a)? 현재 디렉토리와 그 아래 디렉토리를 두드리면 ls -a출력 ..됩니다.
Sami Laine

감사합니다. @SamiLaine 제안을 수정했습니다. 그러나 mv ls -a ../필요에 따라 작동했을 것입니다. 그렇습니다. 필자는 위에서 언급 한 오류를 표시하지만 필요한 폴더 / 파일을 상위 디렉토리로 이동합니다.
Prabhat Kumar Singh

공백이있는 파일에는 작동하지 않습니다.
kenorb

@kenorb ls공백으로 파일을 이동 하려면 명령 을 큰 따옴표 로 묶어야합니다. 필요한 사항을 변경했습니다. 지적 해 주셔서 감사합니다.
Prabhat Kumar Singh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.