현재 폴더의 모든 파일을 하위 폴더로 이동하는 방법은 무엇입니까?


70

나는 길에있다 :

/myuser/downloads/

그리고 하위 폴더를 만듭니다.

/myuser/downloads/new

이제 다운로드 폴더의 모든 파일과 폴더 / 하위 폴더를 하위 폴더로 옮기고 싶습니다.

어떻게해야합니까?

나는 시도했다 :

mv -R *.* new/

그러나 이동은 -R 스위치를 사용하지 않습니다.


4
-R이 필요하지 않습니다. 그럼에도 mv * new불구하고 "새로운 것을 새로운 것으로 바꿀 수 없습니다"또는 이와 유사한 것이있을 것입니다. 아마 mv -i * new당신에게 덮어 쓰기를 방지합니다.

답변:


101

명령

mv !(new) new

트릭을해야합니다. 작동하지 않으면 shopt -s extglob먼저 실행하십시오 .

숨겨진 파일 / 디렉토리 (도트로 시작)를 이동하려면 shopt -s dotglob먼저 실행하십시오 .
요약하자면 다음과 같습니다.

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

( dotglob나쁜 놀라움을 피하기 위해 항상 설정 을 해제 하는 것이 좋습니다 ).


5
의의가 무엇인지 언급 할 수 !(something)있습니까?
Adeerlike

2
@adeer는 말하지 않는 것입니다 (무언가). 다시 말해, 모든 것을 복사하지만 다른 것은 복사하지 마십시오. 진흙처럼 맑습니까?
RockyMountainHigh

4
대단히. zsh에 해당하는 것을 알고 있습니까?
Adeerlike

1
나는 그것을 얻지 못합니다. 예를 들어 폴더의 내용을 dev현재 위치 로 이동하려고 하면 실행해야합니까 mv !(dev) dev?? 나는 얻는다-bash: !: event not found
Black

5
@adeer는 매우 비슷합니다. setopt extendedglobzsh에서 확장 글로브 모드를 설정합니다. ^제외 기호이므로 mv ^new new트릭을 수행하십시오. zsh에서 설정 한 모든 옵션을보고 setopt사용 가능한 확장 글로브 모드를 비활성화하려면unsetopt extendedglob
Mr. T

10

나는 이와 같은 것을 찾았지만 이해하기가 조금 더 간단하며 당신에게도 잘 작동 할 수 있습니다.

ls | grep -v new | xargs mv -t new

위의 솔루션에 설명 추가하기 :

매뉴얼 페이지에서 :

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

단계별 설명 :

  • ls 현재 디렉토리의 파일을 나열합니다
  • grep -v new 새것과 일치하지 않는 파이프를 반환합니다.
  • xargs mv -t new파이프 된 파일 grep -v을 대상 디렉토리 로 이동합니다.

나는이 방법을 시도했지만 나는 얻는다 : mv: illegal option -- t. 내가 사용하고 있기 때문 zsh입니까?
ConstantFun

@ConstantFun zsh 일 수는 있지만 구현 한 것 같습니다 mv(mv의 버전이 사용중인 것과 다르다는 것을 의미합니다) 어떤 운영 체제를 사용하고 있습니까? 나는이 답변을 쓸 때을 centos사용하여 Linux 배포판에 있다고 생각 bash합니다.
lockwobr

2
osx에서 이것을 테스트하면 mv: illegal option -- tosx의 mv에 -t옵션 이 없기 때문에 동일한 오류가 발생 합니다.
lockwobr

1
(나는 이것을 시도하지 않았고 계획하지 않았다.)이 링크 apple.stackexchange.com/questions/69223/… gnucore 를 설치하는 방법을 알려주는 gnucore cli utils, osx를 bsd와 함께 제공하는 방법 리눅스와 함께 제공되는 것과 다른 cli 툴.
lockwobr

나는 OSX 실행 zsh중이므로 아마도 OS 일 것입니다 ..? 설명해 주셔서 감사합니다!
ConstantFun

7

간단한 생각. / myuser 에 있다고 가정하고 다운로드 이름 을 new로 바꾸고 새 다운로드 디렉토리를 작성한 다음 디렉토리로 이동 하십시오.

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.

1

폴더의 모든 파일을 하위 폴더 중 하나로 옮기려면 다음 명령을 사용할 수 있습니다.

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

모든 파일을 찾은 다음 하위 폴더로 옮깁니다.

@waltinator :의 -type d -name 'new' -prune통과를 방지하기 위해 추가되었습니다 /myuser/downloads/new.


나는라는 이름의 하위 디렉토리를 생성 new하고이 명령을했는데, 내가 얻을 mv: missing file operandTry 'mv --help' for more information
mook765

1

이 대체 과정을 시도해 볼 수 있습니다 – – 경로에 남아

/myuser/downloads/

하지만, 대신에 먼저 만드는 /myuser/downloads/new/디렉토리 대신에 폴더를 만들 /myuser/명령으로, 디렉토리 mkdir ../new다음에있는 모든 파일을 이동 downloadsnew, 그리고 마지막으로 이동 newdownloads. /myuser/downloads/경로 에있는 동안 다음 명령을 사용하여 한 줄로 수행 할 수 있습니다 .

mkdir ../new && mv * ../new && mv ../new ../downloads

이후이 경우, 파일 / 폴더의 "필터링"모든 종류의에 대해 걱정할 필요가 없습니다 new와 같은 경로의 동일한 수준에있다 downloads, 그래서 당신은 모든 것을 이동할 수 downloadsnew, 다음 이동 newdownloads`에.

그러나, 당신은 이미 하위 폴더가있는 경우 new생성을하고, 또 다른 하나를 만드는 데 걱정하지 싶지 않아 - 단지 변경 mkdir최초의 왼쪽에 명령을 &&에 위에 표시된 명령에 mv밀어 명령 new에서 통로; 당신이 여전히있는 동안 즉 /myuser/downloads/, 당신은 변경할 수 있습니다 mkdir ../newmv new ... 그런 다음 new[경로에있는 /myuser/downloads/new/] 하위 폴더 /myuser/new/가와 동일한 수준으로 위로 올라간 /myuser/downloads/다음 위에 표시된대로 나머지 명령을 실행할 수 있습니다. 모두 함께, 우리는 경로에서 시작했습니다 /myuser/downloads/.

mv new .. && mv * ../new && mv ../new ../downloads

"다운로드 폴더에있는 모든 파일과 폴더 / 하위 폴더를 하위 폴더 [ new] 로 옮기고 싶었 으니 끝났습니다! 이동할 싶었다 경우 에만 파일 (또는 단지 [더 세분화 된 오브젝트의 움직임을 삽입] 폴더 또는), 당신은 다른 명령을 사용해야하는 것 그 같은 수있는 "필터"객체 grep. 그러나 위에 작성된 명령은 사용자의 목적에 충분합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.