如果标题不清楚,请注意。一个示例文件夹结构,以帮助理解:
/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
或其他任何工作。也愿意使用任何语言来完成工作!
答案 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
语句。