하위 폴더에서 상위 폴더로 모든 파일을 이동하는 셸 스크립트


47

폴더에 여러 폴더가 A있습니다. 모든 해당 폴더에서로 파일을 이동하고 싶습니다 A.

또는

하위 폴더에서 모든 파일을 잘라 내고 상위 폴더에 붙여 넣고 싶습니다.

그렇게하는 방법?


1
나는 이것을 완전히 또는 다른 것으로 테스트하지는 않았지만 터미널의 폴더 A 에서이 명령을 입력하려고 시도 mv */* .했습니까?
Marty Fried

중복 된 파일 이름이 없습니까?
jippie

mv */* .하위 폴더의 하위 폴더에서 파일을 이동하지 않습니다.
Rahul Virpara

@jippie yep, 중복 된 이름이 없습니다
Rahul Virpara

답변:


81

A디렉토리로 이동하여 실행

find . -mindepth 2 -type f -print -exec mv {} . \;

"이 디렉토리와 그 하위 디렉토리에있는 모든 파일을 찾고 대상 디렉토리와 함께 mv를 실행합니다. 발견 된 각 파일에 대해 현재 디렉토리로 이동합니다.


1
또한 이미 상위 디렉토리에있는 파일을 이동하려고합니다.
Rahul Virpara

virpara : 이제이 버전은 .dot 디렉토리의 모든 파일을 잊어 버립니다. 경고를 억제하기 위해 -mindepth 2로 수정했습니다.
Tuminoid

1
GNU와 함께 find당신은 산란을 좀 더 우아하고 수 mv: 각 파일에 대한 과정을find A -mindepth 2 -type f -exec mv -t A \{\} +
데이빗 푀르 스터

David, 버전은 최대 명령 행 길이 제한에 도달 할 때까지 작동합니다. 예를 들어 A와 다른 디렉토리에서 경로를 찾는 경우 find는 경로를 인쇄하는 방법을 고려할 때 어렵지 않습니다.
Tuminoid

9
이것은 매우 위험합니다. 다른 하위 폴더에 동일한 파일 이름을 가진 파일이있는 경우 마지막 찾기로 모든 파일을 덮어 씁니다. --backup = numbered와 함께 mv를 사용하는 것이 좋습니다.find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
pLumo

4

예를 들어 파일을 작성하고 이름을 "cutme"으로 지정하면 (터미널 유형에서 cutme이라는 파일을 작성합니다. 파일 nano cutme을 저장하려면 CTRL + X를 누른 후 Enter 키를 누르십시오.)

  1. 이 작업을 재귀 적으로 수행하려고합니다 (해당 하위 폴더의 하위 폴더 및 하위 폴더에서)
  2. 스크립트 파일 이동을 건너 뛰고 싶습니다
  3. 해당 폴더의 파일을 이동할 수있는 권한이 있습니다
  4. 파일 이름에 공백이 포함되거나 포함되지 않을 수 있습니다

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

줄 안에 이름 cutme를 적어 둡니다 . 실행할 스크립트와 동일해야합니다.

파일을 작성하고 위의 행을 붙여 넣은 후 스크립트와 동일한 폴더에서 다음을 실행하십시오.

chmod +x cutme. 새 파일에 "Executable"플래그가 지정되므로 다음과 같이 실행할 수 있습니다 ./cutme.


이미 상위 디렉토리에있는 파일을 이동해야하는 이유는 무엇입니까?
Rahul Virpara 2016 년

폴더 내부에서 스크립트를 실행합니다. 하위 폴더 내부에 있거나 폴더의 상위 폴더로 이동하지 않는 경우 해당 파일의 모든 파일 여기의 상위 폴더는 스크립트의 위치와 관련하여 상위 폴더입니다. 실제로 마지막 두 점을 변경하면 스크립트를 실행하는 폴더 내에서 모든 파일을 어디로 옮길 지 알 수 있습니다.
Luis Alvarado 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.