![如何将文件从嵌套子目录移到 ubuntu 中的另一个文件夹?(尝试删除许多子文件夹)](https://linux22.com/image/1381684/%E5%A6%82%E4%BD%95%E5%B0%86%E6%96%87%E4%BB%B6%E4%BB%8E%E5%B5%8C%E5%A5%97%E5%AD%90%E7%9B%AE%E5%BD%95%E7%A7%BB%E5%88%B0%20ubuntu%20%E4%B8%AD%E7%9A%84%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%9F%EF%BC%88%E5%B0%9D%E8%AF%95%E5%88%A0%E9%99%A4%E8%AE%B8%E5%A4%9A%E5%AD%90%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%89.png)
我如何搬家文件而不是将目录放入另一个文件夹/父文件夹?
我的文件夹结构非常丑陋,其中一些 .mp3 文件埋在 6 层深的子文件夹中。
我希望使用 Ubuntu 将所有文件(大部分是 .mp3,但不是全部)放在一个目录中,没有任何子目录。
帮助?
答案1
有一个很好的答案在 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
这里,
-maxdepth
选项指定 find 应尝试的深度,1
即仅查找 find 命令中指定的目录。您可以尝试使用2
,3
也可以进行测试。查看 Ubuntu查找手册页以获得详细解释。
答案2
解决方案
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 点可以在其他回复中以与此处相同的方式解决。
- 除了
mv
解决方案-exec +
不需要调用额外的命令(如xargs
或)parallel
并两次交出文件名之外。 - 另一个回复将默默覆盖具有相同名称的文件。在这里,文件将通过选项自动重命名
--backup=numbered
。不幸的是,这些带有后缀的备份~3~
将默认隐藏在大多数文件管理器中。不幸的是,mv
不允许更改后缀,但可以通过其他命令轻松地进行后处理。这是一个 GNU 扩展。 - 相反,它
-print0
-exec command {} +
是 IEEE Std 1003.1 (POSIX)、ISO/IEC 9945 和单一 UNIX 规范标准的一部分。因此它应该更具可移植性。请参阅IEEE 标准 1003.1,2004 年版,IEEE 标准 1003.1,2013 年版和0000243:将 -print0 添加到“查找”。但无论如何,所需的-t
开关mv
是 GNU 扩展,因此整个命令不能在 POSIX 系统之间移植。
注意:在这种情况下,find
能够生成以 开头的路径(我目前-
不知道有任何这样的实现。)应该在选项结束指示符之前:。find
{}
--
答案3
打开终端,cd 到包含文件的文件夹并运行find . -mindepth 2 -type f -print -exec mv {} . \;
以将这些子目录中的所有文件移动到当前目录中。
答案4
不幸的是,我的声誉不够高,无法对标记的解决方案发表评论。但是,我想提醒其他人注意我遇到的一个问题。这很业余;但是,当你做几件事时,它可能一开始就不会出现在你的脑海中。希望它能帮助其他人。
问题
启动命令后,提供了以下消息的变体。然后,该命令创建多个文件。
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
我希望它们最终所在的目录中。