如何在此处将当前子文件夹中的所有文件上移


Answers:


7

我假设您的音频文件扩展名为.mp3

find <AudioFolderPath> -name '*.mp3' -exec mv -it <YourTargetFolder> {} +

笔记:

  • 替换.mp3为您的音频文件扩展名

  • 替换<AudioParentFolderPath>为子文件夹所在的父文件夹。

  • 替换 <YourTargetFolder>为您需要放入所有文件的文件夹路径。

  • 如果来自不同子文件夹的两个文件具有相同的名称,则只会移动一个。

编辑:正如科斯塔斯所说:“该-i开关进行mv交互,它将在覆盖现有文件之前提示”


-t是否允许您先指定目的地?(由于我的“ mv”上没有此选项,因此我只能假设您首先将目标文件夹放入,然后将要移动的文件列表放进去……但是,如果没有,这将尝试适合所有在最后一个文件名中,发出警告)t可能是针对“目标”的?
Olivier Dulac

是的,正如您所说,-t允许首先指定目的地。从mv手册页: -t, --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY
穆罕默德

1
请注意,这是GNU mv的选项,并非在所有unices上都可用(至少在某些生产环境中)。我提供了一个更便携式的解决方案,但是您的Linux可以正常工作
Olivier Dulac

是的@OlivierDulac,对的,谢谢您的来信。
穆罕默德

4
find . -type f -mindepth 2 -exec mv -t ./ {} +

请注意,该命令将覆盖具有相同名称的所有文件。您可以在覆盖之前使用此提示:

find . -type f -mindepth 2 -exec mv -it ./ {} +

说明

  • -type f :仅查找常规文件。
  • -mindepth 2 :仅在子目录中查找文件。
  • -exec mv -it ./ {}-exec表示“ 对找到的每个文件运行此命令 ”。该{}会与文件名来代替。该-i开关使mv互动,这将覆盖现有文件之前提示和-t目标目录设置为./
  • +:将文件放在一起(放在一个参数行中),以使shell可以通过命令操作来调用命令的最短时间(不是一一,而是一到几)。

关于进一步的空文件夹删除,您可以使用相同的记录:

find . -type d -empty -delete

1
-type f仅选择普通文件,不包括符号链接,命名管道等。要移动目录以外的所有文件,您可以执行! -type d
jimmij 2015年

@jimmij我想没有人将音频文件存储为命名管道或其他名称。如果您担心符号链接,可以使用-L参数
Costas

1
-i是标准的,-t是GNU-只(无关的Linux这仅仅是一个内核在一些GNU和非GNU系统中)
斯特凡Chazelas

我同意@StéphaneChazelas:-t在某些系统上不存在(例如不太古老的AIX)
Olivier Dulac

@OlivierDulac几乎不可能找到让每个人都满意的决定,因此欢迎使用各种变体。没人禁止您将字符串更改为find . -type f -mindepth 2 -exec mv {} ./ \;
Costas

2

是的,这是execve()在执行外部命令时传递给系统调用的参数和环境的累积大小的限制。

使用zsh,您可以改用其内置的mv

zmodload -F zsh/files +b:zf_mv
zf_mv ./*/* .

或者使用zargs将列表分成可管理的块:

autoload zargs
zargs -Ifiles ./*/* -- mv files .

ksh93

command -x mv ./*/* .

在GNU xargs和带有内置mvshell的GNU中printf(大多数mksh情况是值得注意的例外):

printf '%s\0' ./*/* | xargs -r0 mv -t .

请记住,OP只希望移动文件,而不移动目录,因此您需要注意这一点。在zsh情况下,你可以把一些水珠预选赛,例如,(.)或者(^/)去年之后*
jimmij 2015年

0

一个非常可移植的解决方案可能是:

在每个子文件夹中找到所有文件,并将其移动到当前目录中

find ./*/ -type f -print | xargs mv -i "{}" ./

您可以| egrep "\.au$|\.mp3$|\.ac3$"在两者之间添加,以确保找到的文件都是带有音频扩展名的文件(添加所需的扩展名以覆盖所有类型,我只提供3个常见的扩展名)


在您的情况下,根本不需要致电find。刚好echoprintf
Costas

@Costas:OP提到有太多文件,无法扩展“ *” ...在这里,我只扩展了50个文件夹名称,其余由xargs处理
Olivier Dulac

但是find,不要解决问题而是解决xargs
Costas
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.