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


9

폴더 만 이동할 필요가없고 파일 만 있습니다.

시도 mv *했지만이 명령은 폴더도 이동합니다.

답변:


13

당신이에서 디렉토리를 제외한 모든 이동하려는 경우 $SOURCE_DIR$TARGET_DIR, 당신은이 명령을 사용할 수 있습니다 :

find "$SOURCE_DIR" -maxdepth 1 -not -type d -exec mv -t "$TARGET_DIR" -- '{}' +

자세히 설명 :

  • find: 디렉토리에서 파일 찾기 찾기
  • $SOURCE_DIR: 검색 할 디렉토리
  • -maxdepth 1: 서브 디렉토리 내부를 보지 마십시오
  • -not -type d: 디렉토리 무시
    • -type f엄격하게 파일 인 것을 복사하려는 경우 에도 사용할 수 있지만 파일이나 디렉토리가 아닌 모든 것을 포착하기 때문에 위의 것을 선호합니다 (특히 기호 링크)
  • -exec mv -t "$TARGET_DIR" -- '{}' +: 모든 일치하는 파일이 mv -t "$TARGET_DIR" -- FILES...있는 곳 에서 명령을 실행하십시오 FILES...(@DavidFoerster 덕분에)

2
find ... -exec mv -t "$TARGET_DIR" -- '{}' +( $TARGET_DIR디렉토리가 없거나 일치가로 시작하는 경우 ) 더 안전 -하고 더 효율적입니다 (매일 일치하는 모든 파일에 대해 새로운 하위 프로세스를 생성하지 않기 때문에).
David Foerster

@DavidFoerster 감사합니다, 업데이트되었습니다 (또한 오늘 새로운 것을 배웠습니다!)
Frxstrem

5

파일을 mv로 만들고 싶다고 생각합니다. 먼저 디렉토리로 이동 하여이 명령을 사용하고 $ TARGET을 대상 디렉토리 경로로 바꿉니다. 복사 할 경우 파일 교체 mv와 함께 cp.

find . -type f -exec mv {} $TARGET \;

이것을 설명하면 find . -type f모든 파일을 선택하고 선택한 모든 항목에 대해 명령을 -exec mv {} $TARGET \;실행하는 것을 의미 mv합니다.


이전 답변에 오류가 mv있습니다. 하위 디렉토리 내의 모든 파일도 있습니다. 빠른 수정은 use -maxdepth 1입니다. 그런 다음 mv하위 디렉토리 내에 재귀 적으로 파일 하지 않습니다 . 아래는 올바른 것입니다 ..

find . -maxdepth 1 -type f -exec mv {} $TARGET \;

질문자가 이것을 원한다고 생각하지 않습니다! 또한 서브 디렉토리의 모든 파일을 동일한 대상 디렉토리로 이동합니다. 는 -type f재귀를 방지하지 않습니다.
마틴 손튼

@MartinThornton 귀하의 제안에 감사드립니다 .. 나는 내 답변을 편집합니다 ...
Emalsha Rasad

3

파이썬 접근

재귀 적으로 파일을 다룰 find때가는 방법입니다. 이 특별한 경우에는 필요하지 않지만 -maxdepth 1다른 답변이 보여주는 것처럼 사용할 수 있습니다 .

간단한 파이썬 명령도 가능합니다. 예를 들면 다음과 같습니다.

$ tree
.
├── a_directory
└── a_file

$ python -c "import os,shutil;fl=[f for f in os.listdir('.') if os.path.isfile(f)];                                      
> map(lambda x:shutil.move(x,'./a_directory'),fl)"

$ tree
.
└── a_directory
    └── a_file

1 directory, 1 file

작동 원리 :

  • fl=[f for f in os.listdir('.') if os.path.isfile(f)]os.listdir('.')찾은 모든 항목을 반복하고 os.path.isfile()함수를 사용하여 항목이 파일인지 테스트합니다 .

  • fl파일리스트가 작성 되면 map()함수 를 사용 합니다. 이 함수는 함수와 항목 목록이라는 두 가지 인수를 사용합니다. 목록의 각 파일마다 제공 한 기능을 수행합니다. 따라서 여기에는 lambda x:shutil.move(x,'./a_directory')익명의 기능이있어 주어진 파일을 지정된 디렉토리로 옮긴 다음 fl빌드 한 파일 목록을 갖 습니다.

가독성과 일반적인 사용법을 위해 이것을 일반적인 파이썬 스크립트로 다시 작성할 수 있습니다. 소스 스크립트와 대상 서브 디렉토리라는 두 개의 인수를 사용합니다.

#!/usr/bin/env python3
from os import listdir
from os.path import isfile,realpath
from os.path import join as joinpath
from shutil import move
from sys import argv

# this is script's full path
script=realpath(__file__)
# get all items in a given directory as list of full paths
fl=[ joinpath(argv[1],f) for f in listdir(argv[1]) ] 
# filter out script itself ( just in case) and directories
fl_filtered = [ f for f in fl if isfile(f) and not script == realpath(f) ]
# Uncomment this in case you want to see the list of files to be moved
# print(fl_filtered)
# move the list of files to the given destination
for i in fl_filtered:
     move(i,argv[2])

사용법은 다음과 같습니다.

$ tree
.
├── a_directory
├── a_file
└── files2subdir.py

1 directory, 2 files

# Notice: the script produces no output unless you uncomment print statement
$ ./files2subdir.py "." "./a_directory"                                                                                  

$ tree
.
├── a_directory
│   └── a_file
└── files2subdir.py

다음은 또 다른 파이썬 접근법입니다
jfs

3

bash 대신 zsh를 사용하는 경우 다음을 수행 할 수 있습니다.

mv "$SOURCE"/*(.) "$TARGET"

(.)말은 글로브 규정라고; .내부는 특히 정규 파일과 일치하는 것을 의미합니다.

을하는 것은 mv *(.) "$target"신속하고 실용적입니다. 그러나 스크립트의 일부로이 작업을 수행하는 경우 Frxstrem 및 David Forester가 제안한 것과 같은 방식 mv -t "$target" -- *(.)으로 다른 사람의 사용에서 발생할 수있는 코너 케이스를보다 잘 처리 할 수 ​​있습니다.


1
David Forester가 내 대답에 지적했듯이 mv -t "$TARGET" -- "$SOURCE"/*(.)더 안전합니다 ( 또는 디렉토리로 "$TARGET"시작 -하거나 디렉토리가 아닌 경우). 나는 zsh 솔루션을 좋아한다!
Frxstrem

2

Python 에서 source-dir디렉토리를 제외한 모든 것을 디렉토리에서 디렉토리로 이동하려면 destination-dir다음을 수행하십시오.

#!/usr/bin/env python3
"""Usage: mv-files <source-dir> <destination-dir>"""
import shutil
import sys
from pathlib import Path

if len(sys.argv) != 3:
    sys.exit(__doc__)  # print usage & exit 1
src_dir, dest_dir = map(Path, sys.argv[1:])
for path in src_dir.iterdir():
    if not path.is_dir():
        shutil.move(str(path), str(dest_dir / path.name))

터미널에서 Python 파일 실행을 참조하십시오 .


@ SergiyKolodyazhnyy 나는 pep-8에서 그러한 요구 사항을 보지 못했고 (예에 따르면) 실제로는 정반대입니다 : import mypackagebeforefrom mypackage import ...
jfs

@SergiyKolodyazhnyy는 특별 from __future__수입품과 일반 from pathlib수입품을 혼동하지 않습니다 .
jfs

그래, 내가 그 부분을 잘못 읽은 것 같아 아니오, 당신 말이 맞아요, import module먼저 (라이브러리 및 써드 파티 수입품) from module import object마지막이어야합니다 (지역 / 도서관에 따라
다름

0

나는 사용할 것이다

mv *.*

폴더에 확장자가없는 한 작동합니다.

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