如何将文件从嵌套子目录移到ubuntu中的另一个文件夹?(试图剥离许多子文件夹)


36

如何将文件而不是目录移动到另一个文件夹/父文件夹中?

我的文件夹结构非常丑陋,一些.mp3文件在子文件夹中深入6级。

我想使用Ubuntu将所有文件(大多数是.mp3,但不是全部)放在一个目录中,根本没有子目录。

救命?

Answers:


48

在askubuntu-QA中有一个很好的答案。

为此,请打开一个终端并执行以下命令:

mv  -v ~/Downloads/* ~/Videos/

它将所有文件和文件夹从“下载”文件夹移动到“视频”文件夹。


要移动所有文件,但不移动文件夹:

但是,如果您有兴趣将所有文件(而非文件夹)从“下载”文件夹移动到“视频”文件夹,请使用此命令

find ~/Downloads/ -type f -print0 | xargs -0 mv -t ~/Videos

要仅移动“下载”文件夹中的文件,而不移动子文件夹中的文件,请执行以下操作:

如果要移动“下载”文件夹中的所有文件,而不是“下载”文件夹中文件夹中的任何文件,请使用以下命令:

find ~/Downloads/ -maxdepth 1 -type f -print0 | xargs -0 mv -t ~/Videos

在这里,-maxdepthoption指定了find应该尝试的深度, 1即仅find命令中指定的目录。您可以尝试使用23也可以进行测试。

有关详细说明,请参见Ubuntu 查找手册页

资源


如果我想将所有文件复制到该文件夹​​中,是否只需要将mv更改为cp?我是Linux
新手

13

find /src/dir -type f -exec mv --backup=numbered -t /dst/dir {} +

该命令会发现在所有的常规文件/src/dir(包括所有子目录),并将其移动到/dst/dir通过使用该命令mv。只需将目录替换为您的目录即可。具有相同名称的文件将自动重命名。

选择要移动的文件

如果只想移动MP3文件,请-iname "*.mp3"find后面的命令中添加选项-type f

与c0dev的回复比较

只有c0dev答复中的第二条命令才能回答该问题。下面是它与该回复的比较。点3和点4可以在其他答复中以与此处相同的方式解决。

  1. mv的解决方案外,-exec +无需调用其他命令(例如xargs或)parallel并将文件名移交两次。
  2. 另一个答复将静默覆盖具有相同名称的文件。在这里,文件将自动重命名,这要归功于选项--backup=numbered。不幸的是~3~,默认情况下,这些带有后缀的备份将隐藏在大多数文件管理中。不幸的是mv,不允许更改后缀,但是可以通过附加命令轻松对其进行后处理。这是一个GNU扩展。
  3. 相反,它-print0 -exec command {} +是IEEE Std 1003.1(POSIX),ISO / IEC 9945和Single UNIX规范标准的一部分。因此,它应该更便携。参见IEEE Std 1003.1,2004 EditionIEEE Std 1003.1,2013 Edition0000243:将-print0添加到“ find”。但是无论如何,必需的-t开关mv是GNU扩展,因此整个命令不能在POSIX系统之间移植。

注意:如果find能够生成以-(我目前不知道这种实现方式find)开头的路径,{}则应在选项结束指示符之前加上--


错误:查找:缺少--exec的参数
克里斯,克里斯,

@克里斯:你是对的,似乎{}必须作为最后一个论点。已更正。
pabouk

@Chris:现在可以按您的意愿工作吗?如果是,您可能会接受答案,因此您的问题不会显示为“未解决”。
pabouk

这就是我正在运行的程序,并且收到未找到目录的错误:
克里斯(Chris)

我正在运行的内容:clstal @ clap:〜$ ls第一个脚本。RFirefox_wallpaper.png part1vidproj zotero pdf管理器桌面mozilla.pdf图片文档父视频clstal @ clap:〜$找到/ source / directory -type f -exec mv -t / destination / directory {} +查找:`/ source / directory':没有这样的文件或目录
Chris

2

不幸的是,我没有足够高的声誉来评论标记的解决方案。但是,我想提醒其他人我遇到的问题。这是相当业余的;但是,当您做几件事时,一开始可能不会想到。希望它将对其他人有所帮助。

问题

启动命令后,提供了以下消息的变体。然后,该命令将创建多个文件。

mv: `/data/share/docs/src/dir/filename.ext' and `/data/share/docs/src/dst/filename.ext' are the same file

原因

/src是的父/dst(例如/src/../dst/)。

虽然可能有更好的解决方案,但我只是将文件移到我外部的临时目录中/src,然后重新运行命令以将它们放回/src/../dst我希望它们最终位于的目录中。


2

我的一线工具-在Mac上可以使用,但在任何* nix上也可以使用。从父目录开始。

# Move files to parent and delete empty folders
find . -not -type d -print0 | xargs -0J % mv -f % . ; find . -type d -depth -print0 | xargs -0 rm -rf

第一部分将所有子文件夹中的所有内容移动到启动命令的实际文件夹;第二部分检查子目录是否为空(它们现在应为:-)并删除它们,以便在此处获得所有内容而没有子目录。


(1)请说明您的答案的作用,以及与其他答案(非常相似)相比有何优势。请不要在评论中回复;编辑  您的答案,使其更清晰,更完整。(2)请注意,-not操作员是非标准操作员,因此您的命令比其他命令的可移植性差。
斯科特,

找 。-非类型d -print0 | xargs -0J%mv -f%; 找 。型d -depth -print0 | xargs -0 rm -rf我在一个文件夹中运行了此命令,它删除了子文件夹,我所在的文件夹,然后上移到父文件夹。幸运的是,我正在监视文件管理器并设法停止了该命令,该命令已在测试文件夹中运行。
威尔

1

打开终端,cd到包含文件的文件夹的文件夹中,然后运行find . -mindepth 2 -type f -print -exec 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.