我也有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和带有内置mvshell的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可能是针对“目标”的?