如何仅将当前文件夹中的文件移动到子文件夹?


9

我不必移动文件夹,仅移动文件。

我已经尝试过,mv *但是此命令也可以移动文件夹。

Answers:


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'4

@DavidFoerster谢谢,更新了(今天也学到了新东西!)
Frxstrem

5

我认为您只想播放文件。首先转到目录并使用此命令,将$ TARGET替换为目标目录路径。如果要复制文件,请替换mvcp

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不会阻止递归。
马丁·桑顿

@MartinThornton谢谢您的建议..我将编辑我的答案...
Emalsha Rasad

3

Python方法

当递归处理文件时,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

这是另一种Python方法
jfs

3

如果您使用的是zsh而不是bash,则可以执行以下操作:

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

所述(.)在端部被称为圆顶封装限定符; 在.内部明确表示只匹配常规文件。

这样做mv *(.) "$target"既快速又实用。但是,如果您将此操作作为脚本的一部分,则可能需要考虑编写类似于Frxstrem和David Forester建议的内容mv -t "$target" -- *(.),以更好地处理其他人使用中可能出现的极端情况。


1
正如David Forester在我的答案中指出的那样,mv -t "$TARGET" -- "$SOURCE"/*(.)这样做会更安全("$TARGET"以a开头-或不是目录的情况)。我确实喜欢zsh解决方案!
Frxstrem '04

2

source-dirdestination-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))

请参阅在Terminal中运行Python文件


@SergiyKolodyazhnyy我不PEP-8看到这样的要求和(根据实施例有),它实际上是完全相反的:import mypackagefrom mypackage import ...
JFS

@SergiyKolodyazhnyy不要混淆特殊from __future__进口和普通from pathlib进口。
jfs

是的,好像我看错了那部分。不,您是对的,import module应该是第一个(是图书馆和第三方进口的),from module import object应该是最后一个(特定于本地/图书馆)
Sergiy Kolodyazhnyy

0

我会用

mv *.*

只要您的文件夹没有扩展名,它就可以工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.