递归重命名文件以使文件名成为其路径的串联

时间:2016-02-10 17:32:39

标签: python node.js bash

如果标题不清楚,请注意。一个示例文件夹结构,以帮助理解:

/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

我在bash上并不擅长,所以我必须要做的就是:

find . -name "*.png"

将找到所有文件,然后我希望使用-exec rename或其他任何工作。也愿意使用任何语言来完成工作!

3 个答案:

答案 0 :(得分:2)

bash中的解决方案:

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

由于parameter expansion,这会找到images_dir目录中的所有文件,用/替换其路径中的所有-,并将文件移动到新路径。

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

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

如评论中的@gniourf_gniourf通知,如果您的文件名包含空格或换行符,则会失败。 空白性能:

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

答案 1 :(得分:1)

在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])

为了给予适当的信任,我从this回答了find函数。

答案 2 :(得分:0)

这应该适合你:

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

反引号find命令将扩展为以&#34; .png&#34;结尾的文件列表,-iname以独立于案例的方式执行搜索。

sed命令将用短划线替换所有斜杠,从而产生新的目标名称。

mv解除了沉重的负担。 -v是可选的,会导致详细移动。

要进行调试,您可以在echo前面添加mv语句。