将所有文件从子文件夹移动到具有重复文件名的主文件夹



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

解释:

photo_folder充满了图像(各种扩展名)。 大多数情况下,图像已经在此文件夹中。 但有时,如下例所示,图像隐藏在一个或多个photo_subfolder中,文件名通常相同,例如 1.jpg、2.jpg...在他们每个人中。

基本上,我想将所有图像文件从photo_subfolder移动到它们的photo_folder,并在合并在一起之前重命名所有重复的文件名。

例:

|parent_folder
|    |photo_folder
|    |    |photo_subfolder1
|    |    |    1.jpg
|    |    |    2.jpg
|    |    |    3.jpg
|    |    |photo_subfolder2
|    |    |    1.jpg
|    |    |    2.jpg
|    |    |    3.jpg
|    |    |photo_subfolder3
|    |    |    1.jpg
|    |    |    2.jpg
|    |    |    3.jpg

期望:

|parent_folder
|    |photo_folder
|    |    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

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

谢谢!

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

我尝试在这里重新创建您的目录树示例 - 非常简单,但我希望它可以适应您的情况。请注意,我正在使用bash.

#!/bin/bash
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

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

  1. 递归方式find子目录中的所有文件并循环访问它们
  2. 使用sed替换为"_"并将其存储在变量new_filepath中(我也删除了初始parent_,但这是可选的)
  3. 将旧filepath复制(或移动)到文件名为new_filepathparent
for xtension in jpg png gif; do
while IFS= read -r -d '' filepath; do
new_filepath=$(echo "${filepath}" | sed s@/@_@g)
cp "${filepath}" "${bd}/${new_filepath}"
done < <(find ${bd} -type f -name "*${xtension}" -print0)
done
ls ${bd}

如果还想从new_filepath中删除其他parent_,可以将上述new_filepath替换为:

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

我假设您在脚本中定义了所有可能的扩展。否则,要在目录树中查找所有扩展,您可以使用上一个答案中的以下代码片段

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

最新更新