根据文件名中的特定模式移动文件,同时保留文件夹结构

Move file according to specific pattern in filename while retaining the folder structure

我需要将文件名中包含字符串“Unknown Quality”的所有文件及其外部 2 个文件夹移动到名为“Unknown”的文件夹中,该文件夹与基本文件夹位于同一目录中。我想在基本文件夹中添加,文件有 3 个文件夹深,因此在移动匹配的文件时,它应该将 $folder1 留在 base_folder 本身。

Unknown_folder

base_folder
  $folder1
    $folder2
      $folder3
        $filename-Unknown Quality.mpk/mp4/avi

################### Expected result ###################

Unknown_folder
  $folder2
    $folder3
      $filename-Unknown Quality.mpk/mp4/avi

base_folder
  $folder1

经过一番搜索,我发现了这个基本的查找命令,尽管它不适合我,因为它只是移动与模式和 ingores 目录结构匹配的文件。正如我上面在移动匹配文件时所解释的那样,我还需要相对于移动的匹配文件的外部 2 目录结构

find . -name "*Unknown Quality*" -exec mv "{}" Unknown \;   

希望有人能帮助我。我不太确定什么是最好的方法,但是 bash , perl , python 所有这些都应该很容易实现这个

请您尝试以下操作:

#!/bin/bash

find root -name "*Unknown Quality*" -type f -print0 | while IFS= read -r -d "" f; do
    f2=${f%/*}          # removes the rightmost "/" and following filename
    f2=${f2%/*}         # removes the second rightmost "/" and following dirname
    if [[ -d $f2 ]]; then
                        # consider the case the folder is already removed
        mv -- "$f2" "Unknown_folder"
    fi
done

请注意,上面的代码没有考虑目录“Unknown_folder”中相同目录名冲突的情况。