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

Ped*_*lez 8 command-line shell file-management

我也有 50 个文件夹和一些子文件夹,总共有 1000 多个音频文件。我需要删除所有子文件夹并将所有文件放在当前级别。尝试过mv */* ./但它抱怨:参数列表太长

Muh*_*d Z 7

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

find <AudioFolderPath> -name '*.mp3' -exec mv -it <YourTargetFolder> {} +
Run Code Online (Sandbox Code Playgroud)

笔记:

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

  • 替换<AudioParentFolderPath>为包含子文件夹的父文件夹。

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

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

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


Cos*_*tas 5

find . -type f -mindepth 2 -exec mv -t ./ {} +
Run Code Online (Sandbox Code Playgroud)

请注意,该命令将覆盖任何同名文件。您可以使用它在覆盖之前进行提示:

find . -type f -mindepth 2 -exec mv -it ./ {} +
Run Code Online (Sandbox Code Playgroud)

解释

  • -type f: 只查找常规文件。
  • -mindepth 2:仅查找子目录中的文件。
  • -exec mv -it ./ {}-exec意思是“对找到的每个文件运行此命令”。将{}替换为文件名。该-i开关是mv交互式的,它会在覆盖现有文件之前进行提示,并将-t目标目录设置为./.
  • +:将文件放在一起(在一个参数行中),尽可能多的文件可以使用命令进行操作,以调用命令最少次数(不是一一而是一对多)。

关于进一步的空文件夹删除,您可以使用相同的接收方式:

find . -type d -empty -delete
Run Code Online (Sandbox Code Playgroud)