Answers:
如果要将除目录以外的所有内容都从$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)我认为您只想播放文件。首先转到目录并使用此命令,将$ TARGET替换为目标目录路径。如果要复制文件,请替换mv
为cp
。
find . -type f -exec mv {} $TARGET \;
如果我对此进行解释,则find . -type f
意味着选择所有文件,并对所有选中的项目-exec mv {} $TARGET \;
执行mv
命令。
先前的答案有一个错误。它的mv
所有文件也位于子目录中。快速解决方法是使用-maxdepth 1
。然后,它不会递归地将mv
文件放在子目录中。下面是正确的一个。
find . -maxdepth 1 -type f -exec mv {} $TARGET \;
-type f
不会阻止递归。
当递归处理文件时,find
是一种方法。在这种特殊情况下,这不是必需的,但可以与-maxdepth 1
其他答案一起使用。
简单的python命令也可以做到。这是一个例子:
$ 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
,我们将建立的文件列表。
为了提高可读性和通用性,我们还可以将其重写为通用python脚本,该脚本带有两个参数-源目录和目标子目录。
#!/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
如果您使用的是zsh而不是bash,则可以执行以下操作:
mv "$SOURCE"/*(.) "$TARGET"
所述(.)
在端部被称为圆顶封装限定符; 在.
内部明确表示只匹配常规文件。
这样做mv *(.) "$target"
既快速又实用。但是,如果您将此操作作为脚本的一部分,则可能需要考虑编写类似于Frxstrem和David Forester建议的内容mv -t "$target" -- *(.)
,以更好地处理其他人使用中可能出现的极端情况。
mv -t "$TARGET" -- "$SOURCE"/*(.)
这样做会更安全("$TARGET"
以a开头-
或不是目录的情况)。我确实喜欢zsh解决方案!
要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))
import mypackage
前from mypackage import ...
from __future__
进口和普通from pathlib
进口。
import module
应该是第一个(是图书馆和第三方进口的),from module import object
应该是最后一个(特定于本地/图书馆)
我会用
mv *.*
只要您的文件夹没有扩展名,它就可以工作。
find ... -exec mv -t "$TARGET_DIR" -- '{}' +
会更安全(如果$TARGET_DIR
没有目录或匹配以开头-
),并且效率更高(因为它不会为每个匹配的文件生成一个新的子进程)。