我怎么能在Python中做mv src/* dest/的等效?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
我怎么能在Python中做mv src/* dest/的等效?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
当前回答
对于任意一个os。重命名或shutil。移动您将需要导入的模块。 不需要*字符来移动所有文件。
我们在/opt/awesome有一个名为source的文件夹,其中一个文件名为awesome.txt。
in /opt/awesome
○ → ls
source
○ → ls source
awesome.txt
python
>>> source = '/opt/awesome/source'
>>> destination = '/opt/awesome/destination'
>>> import os
>>> os.rename(source, destination)
>>> os.listdir('/opt/awesome')
['destination']
我们用os。可以看到文件夹名称实际上发生了更改。 这是将目的地移回原点的梭。
>>> import shutil
>>> source = '/opt/awesome/destination'
>>> destination = '/opt/awesome/source'
>>> shutil.move(source, destination)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']
这一次,我检查了源文件夹,以确保我创建的awesome.txt文件存在。它就在那里:)
现在,我们已经将一个文件夹及其文件从源移动到目标,然后再移动回来。
其他回答
因为你不关心返回值,你可以这样做
import os
os.system("mv src/* dest/")
这是解决方案,它不启用shell使用mv。
from subprocess import Popen, PIPE, STDOUT
source = "path/to/current/file.foo",
destination = "path/to/new/destination/for/file.foo"
p = Popen(["mv", "-v", source, destination], stdout=PIPE, stderr=STDOUT)
output, _ = p.communicate()
output = output.strip().decode("utf-8")
if p.returncode:
print(f"E: {output}")
else:
print(output)
对于任意一个os。重命名或shutil。移动您将需要导入的模块。 不需要*字符来移动所有文件。
我们在/opt/awesome有一个名为source的文件夹,其中一个文件名为awesome.txt。
in /opt/awesome
○ → ls
source
○ → ls source
awesome.txt
python
>>> source = '/opt/awesome/source'
>>> destination = '/opt/awesome/destination'
>>> import os
>>> os.rename(source, destination)
>>> os.listdir('/opt/awesome')
['destination']
我们用os。可以看到文件夹名称实际上发生了更改。 这是将目的地移回原点的梭。
>>> import shutil
>>> source = '/opt/awesome/destination'
>>> destination = '/opt/awesome/source'
>>> shutil.move(source, destination)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']
这一次,我检查了源文件夹,以确保我创建的awesome.txt文件存在。它就在那里:)
现在,我们已经将一个文件夹及其文件从源移动到目标,然后再移动回来。
这是我现在用的:
import os, shutil
path = "/volume1/Users/Transfer/"
moveto = "/volume1/Users/Drive_Transfer/"
files = os.listdir(path)
files.sort()
for f in files:
src = path+f
dst = moveto+f
shutil.move(src,dst)
现在功能齐全了。希望这对你有所帮助。
编辑:
我将其转换为一个函数,接受源目录和目标目录,如果目标文件夹不存在,则创建目标文件夹,并移动文件。还允许过滤src文件,例如,如果你只想移动图像,那么你使用'*.jpg'模式,默认情况下,它会移动目录中的所有内容
import os, shutil, pathlib, fnmatch
def move_dir(src: str, dst: str, pattern: str = '*'):
if not os.path.isdir(dst):
pathlib.Path(dst).mkdir(parents=True, exist_ok=True)
for f in fnmatch.filter(os.listdir(src), pattern):
shutil.move(os.path.join(src, f), os.path.join(dst, f))
根据这里描述的答案,使用subprocess是另一种选择。
就像这样:
subprocess.call("mv %s %s" % (source_files, destination_folder), shell=True)
我很好奇,与shutil相比,这种方法的优点和缺点。因为在我的情况下,我已经使用subprocess的其他原因,它似乎工作,我倾向于坚持它。
这取决于运行脚本的shell。mv命令适用于大多数Linux shell (bash、sh等),但也适用于Windows上的Git bash等终端。对于其他终端,您必须将mv更改为另一个命令。