我也有50个文件夹和一些子文件夹,总共有1000多个音频文件。我需要删除所有子文件夹并将所有文件置于当前级别。尝试过mv */* ./
但抱怨:参数列表太长
我也有50个文件夹和一些子文件夹,总共有1000多个音频文件。我需要删除所有子文件夹并将所有文件置于当前级别。尝试过mv */* ./
但抱怨:参数列表太长
Answers:
我假设您的音频文件扩展名为.mp3
find <AudioFolderPath> -name '*.mp3' -exec mv -it <YourTargetFolder> {} +
替换.mp3
为您的音频文件扩展名
替换<AudioParentFolderPath>
为子文件夹所在的父文件夹。
替换 <YourTargetFolder>
为您需要放入所有文件的文件夹路径。
如果来自不同子文件夹的两个文件具有相同的名称,则只会移动一个。
编辑:正如科斯塔斯所说:“该-i
开关进行mv
交互,它将在覆盖现有文件之前提示”
-t
允许首先指定目的地。从mv
手册页: -t, --target-directory=DIRECTORY
move all SOURCE arguments into DIRECTORY
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
-type f
仅选择普通文件,不包括符号链接,命名管道等。要移动目录以外的所有文件,您可以执行! -type d
。
-L
参数
-i
是标准的,-t
是GNU-只(无关的Linux这仅仅是一个内核在一些GNU和非GNU系统中)
-t
在某些系统上不存在(例如不太古老的AIX)
find . -type f -mindepth 2 -exec mv {} ./ \;
是的,这是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
和带有内置mv
shell的GNU中printf
(大多数mksh
情况是值得注意的例外):
printf '%s\0' ./*/* | xargs -r0 mv -t .
zsh
情况下,你可以把一些水珠预选赛,例如,(.)
或者(^/)
去年之后*
。
一个非常可移植的解决方案可能是:
在每个子文件夹中找到所有文件,并将其移动到当前目录中
find ./*/ -type f -print | xargs mv -i "{}" ./
您可以| egrep "\.au$|\.mp3$|\.ac3$"
在两者之间添加,以确保找到的文件都是带有音频扩展名的文件(添加所需的扩展名以覆盖所有类型,我只提供3个常见的扩展名)
find
。刚好echo
或printf
find
,不要解决问题而是解决xargs
。
t
可能是针对“目标”的?