【问题标题】:Moving all files from subfolders to main folders with duplicate file names将所有文件从子文件夹移动到具有重复文件名的主文件夹
【发布时间】:2022-11-28 18:19:01
【问题描述】:

我一直在尝试编写一个小脚本来对我的 Linux 服务器中的图像文件进行排序。 我尝试了在 StackExchange 中找到的多种解决方案,但它始终无法满足我的要求。

https://superuser.com/questions/999922/move-all-files-from-multiple-subfolders-into-the-parent-folder https://superuser.com/questions/1146686/move-all-files-within-subfolders-to-parent-folder

我在解释:

我有一堆装满图像的文件夹(各种扩展名)。 大多数情况下,图像已经在父文件夹中。 但有时图像隐藏在一个或多个子文件夹中,并且文件名经常重复,例如不同照片集中的 1.jpg、2.jpg。 有时是一团糟。

基本上我想将所有图像文件带到父文件夹,无论结构、混乱或重复文件名如何。

我得到的最糟糕的情况是:

|parent
|    |photoset1
|    |    1.jpg
|    |    2.jpg
|    |    3.jpg
|    |    ...
|    |photoset2
|    |    1.jpg
|    |    2.jpg
|    |    3.jpg
|    |    ...
|    |photoset3
|    |    1.jpg
|    |    2.jpg
|    |    3.jpg
|    |    ...

我希望得到这样的东西:

|parent
|    |1_a.jpg
|    |2_a.jpg
|    |3_a.jpg
|    |...
|    |1_b.jpg
|    |2_b.jpg
|    |3_b.jpg
|    |...
|    |1_c.jpg
|    |2_c.jpg
|    |3_c.jpg
|    |...

请注意,文件名只是一个示例。可以是任何东西。

现在,我的主要问题是重复的文件名,有时会使所有内容无法正确合并到父文件夹中。

谢谢!

【问题讨论】:

  • 您可以为此使用rename,例如stackoverflow.com/a/62720198/2836621
  • 嗨,马克,感谢您的回复。实际上,我已经在我的一些 bash 脚本中使用了重命名。但在那种情况下它不起作用。如果你再读一遍我的帖子,它比批量重命名文件要复杂得多。
  • 您基本上是将目录名称 photoset1photoset2 或其他名称折叠成 ab 或其他名称。因此,如果您将目录名称附加到列表(没有重复项),则可以在列表中使用索引而不是 ab

标签: bash file directory subdirectory mv


【解决方案1】:

您可以将子目录的 / 替换为另一个字符,例如_ ,然后将原始文件cp/mv 到parent 目录。

我尝试在此处重新创建您的目录树示例 - 非常简单,但我希望它可以适应您的情况。

# example of the `parent` tree
bd=parent
mkdir ${bd}

for i in `seq 3`; do
  mkdir -p ${bd}/photoset_${i}/subset_${i}

  for j in `seq 5`; do
    touch ${bd}/photoset_${i}/${j}.jpg
    touch ${bd}/photoset_${i}/${j}.png
    touch ${bd}/photoset_${i}/subset_${i}/${j}.jpg
    touch ${bd}/photoset_${i}/subset_${i}/${j}.gif
  done
done

这是将文件从子目录复制到 parent 目录的脚本。基本上

  1. find所有文件在子目录中递归并循环
  2. 使用sed替换为'_'并将其存储在变量new_filepath
  3. 将旧的filepath复制(或移动)到parent,文件名为new_filepath
    for xtension in jpg png gif; do
      for filepath in `find ${bd} -name *${xtension}`; do
    
        new_filepath=`echo ${filepath} | sed s@/@_@g`
        cp ${filepath} ${bd}/${new_filepath}
    
      done
    done
    

    如果您还想从 new_filepath 中删除额外的 parent_,您可以将上面的 new_filepath 替换为:

    new_filepath=`echo ${filepath} | sed s@/@_@g | sed s/${bd}_//g`
    

    我假设您在脚本中定义了所有可能的扩展名。否则,要在目录树中查找所有扩展名,您可以使用来自 previous answer 的以下 sn-p

    find . -type f -name '*.*' | sed 's|.*.||' | sort -u
    

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2020-08-30
    • 1970-01-01
    相关资源
    最近更新 更多