recursion重命名文件以使文件名成为path的串联

对不起,如果标题不清楚。 示例文件夹结构有助于理解:

/images/icons/654/323/64/64/icon.png /images/icons/837/283/64/64/icon.png 

被重命名为

 /images-icons-654-323-64-64-icon.png /images-icons-837-283-64-64-icon.png 

我不是很棒,所以我必须从头开始:

 find . -name "*.png" 

这将find所有的文件,然后我希望使用-exec rename ,或任何工作。 也开放使用任何语言来完成工作!

在Python中你可以这样做:

 import fnmatch import os def find(base_dir, some_string): matches = [] for root, dirnames, filenames in os.walk(base_dir): for filename in fnmatch.filter(filenames, some_string): matches.append(os.path.join(root, filename)) return matches files = find('.', '*.png') new_files = ['-'.join(ele.split('/')[1:]) for ele in files] for idx, ele in enumerate(files): os.rename(ele, new_files[idx]) 

为了给予适当的信贷,我从这个答案中findfunction。

解决scheme在bash中:

 for f in $(find images_dir -type f); do mv -v "$f" ${f//\//-} done 

这将findimages_dir目录中的所有文件,并使用参数扩展replace其path中的任何/ ,并将文件移动到新path。

例如,文件images_dir/icons/654/321/b.png将被移动到images_dir-icons-654-321-a.png

请注意,如果你执行find . ,你会遇到一个问题, find输出文件名以./开头,这意味着你的文件将被重命名为.-<filename>

如注释中的@gniourf_gniourf通知,如果您的文件名包含空格或换行符,这将失败。 空格certificate:

 find images_dir -type f -exec bash -c 'for i; do mv -v "$i" "${i//\//-}; done' _ {} + 

这应该为你做:

 for file in `find image -iname "*.png"` do newfile=`echo "$file" | sed 's=/=-=g'` mv -v $file $newfile done 

反向find命令将展开为以“.png”结尾的文件列表, -iname以与个案无关的方式执行search。

sed命令将用破折号replace所有斜线,导致新的目标名称。

这个mv很重。 -v是可选的,会引起详细的移动。

为了debugging,你可以在mv前面加一个echo语句。