답변:
당신이에서 디렉토리를 제외한 모든 이동하려는 경우 $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 덕분에)파일을 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
재귀를 방지하지 않습니다.
재귀 적으로 파일을 다룰 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
bash 대신 zsh를 사용하는 경우 다음을 수행 할 수 있습니다.
mv "$SOURCE"/*(.) "$TARGET"
(.)
말은 글로브 규정라고; .
내부는 특히 정규 파일과 일치하는 것을 의미합니다.
을하는 것은 mv *(.) "$target"
신속하고 실용적입니다. 그러나 스크립트의 일부로이 작업을 수행하는 경우 Frxstrem 및 David Forester가 제안한 것과 같은 방식 mv -t "$target" -- *(.)
으로 다른 사람의 사용에서 발생할 수있는 코너 케이스를보다 잘 처리 할 수 있습니다.
mv -t "$TARGET" -- "$SOURCE"/*(.)
더 안전합니다 ( 또는 디렉토리로 "$TARGET"
시작 -
하거나 디렉토리가 아닌 경우). 나는 zsh 솔루션을 좋아한다!
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 파일 실행을 참조하십시오 .
import mypackage
beforefrom mypackage import ...
from __future__
수입품과 일반 from pathlib
수입품을 혼동하지 않습니다 .
import module
먼저 (라이브러리 및 써드 파티 수입품) from module import object
마지막이어야합니다 (지역 / 도서관에 따라
나는 사용할 것이다
mv *.*
폴더에 확장자가없는 한 작동합니다.
find ... -exec mv -t "$TARGET_DIR" -- '{}' +
($TARGET_DIR
디렉토리가 없거나 일치가로 시작하는 경우 ) 더 안전-
하고 더 효율적입니다 (매일 일치하는 모든 파일에 대해 새로운 하위 프로세스를 생성하지 않기 때문에).