我一直在尝试编写一个小脚本来对 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
目录的脚本。基本上
- 递归方式
find
子目录中的所有文件并循环访问它们 - 使用
sed
将替换为"_"并将其存储在变量
new_filepath
中(我也删除了初始parent_
,但这是可选的) - 将旧
filepath
复制(或移动)到文件名为new_filepath
的parent
中
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