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])
为了给予适当的信贷,我从这个答案中find
function。
解决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
语句。