如何在 Mac OS 上查找超过 42 个字符的文件名
How to find filenames longer than 42 chars on Mac OS
我需要缩短外部硬盘驱动器上某些文件的名称,以便将它们存储在另一个加密驱动器上(加密不允许文件名超过 42 个字符)。我需要重命名的文件组织在具有任意子文件夹深度的多个文件夹中。
我正在考虑两种选择:
- 有什么方法可以在 Automator 中获取文件名超过 42 个字符的文件列表?然后我会手动重命名它们 - 我不希望它们太多。
- 是否有一个简单但强大的 shell 脚本可以将文件名裁剪到特定长度(对所有文件夹迭代,对所有子文件夹递归)?如果多个文件名的裁剪导致相同的文件名,它也应该能够处理冲突。
你能帮我做一些选择吗?或者您还有其他建议吗?
假设
您只想将加密驱动器用于备份而不是日常使用。
回答
创建 zip
/tar.gz
文件以存储在备份驱动器上。这将维护文件的名称、权限和时间。
编辑假设不成立。
选项 #2:在加密驱动器上创建虚拟文件系统。 Ask Different 上的 This answer 展示了如何为此使用 MacZFS,但我不明白为什么你不能简单地使用 HFS+。
您可以在 shell 中执行此操作... find
将为您提供递归到子目录中的所有文件的列表,从 dot
开始 - 当前目录:
find .
输出
./vips/libvips/tools/vipsedit.c
./vips/libvips/tools/vipsheader.c
./vips/libvips/tools/vipsprofile
./vips/libvips/tools/vipsthumbnail.c
./vips/libvips/vips-cpp.pc.in
./vips/libvips/vips.pc.in
./vips/libvips/vipsCC.pc.in
然后awk
可以告诉你长度:
find . | awk '{l=length([=12=]);print length,[=12=]}'
输出
33 ./vips/libvips/tools/vipsheader.c
32 ./vips/libvips/tools/vipsprofile
36 ./vips/libvips/tools/vipsthumbnail.c
29 ./vips/libvips/vips-cpp.pc.in
25 ./vips/libvips/vips.pc.in
27 ./vips/libvips/vipsCC.pc.in
或者,如果您只想要长于 32 的那些:
find . | awk '{l=length([=14=]);if(length>32)print length,[=14=]}'
输出
43 ./vips/libvips/tools/batch_image_convert.in
42 ./vips/libvips/tools/batch_rubber_sheet.in
37 ./vips/libvips/tools/light_correct.in
36 ./vips/libvips/tools/shrink_width.in
33 ./vips/libvips/tools/vipsheader.c
36 ./vips/libvips/tools/vipsthumbnail.c
或者你可以使用这个:
find . | awk '{base=[=16=];sub(/.*\//,"",base);x=length(base);if(x>42)print [=16=],x,base}'
awk
获取$0中的整行,然后复制到base
。然后它会删除直到最后一个斜杠的所有内容并将其重新保存为 base
。然后它获取 base
的长度,如果大于 42,则显示完整的原始名称、基本名称的长度和基本名称本身。
find
工具支持正则表达式,这提供了一种按长度过滤文件的简便方法:
find -E . -regex '.*/[^/]{43,}'
我需要缩短外部硬盘驱动器上某些文件的名称,以便将它们存储在另一个加密驱动器上(加密不允许文件名超过 42 个字符)。我需要重命名的文件组织在具有任意子文件夹深度的多个文件夹中。
我正在考虑两种选择:
- 有什么方法可以在 Automator 中获取文件名超过 42 个字符的文件列表?然后我会手动重命名它们 - 我不希望它们太多。
- 是否有一个简单但强大的 shell 脚本可以将文件名裁剪到特定长度(对所有文件夹迭代,对所有子文件夹递归)?如果多个文件名的裁剪导致相同的文件名,它也应该能够处理冲突。
你能帮我做一些选择吗?或者您还有其他建议吗?
假设
您只想将加密驱动器用于备份而不是日常使用。
回答
创建 zip
/tar.gz
文件以存储在备份驱动器上。这将维护文件的名称、权限和时间。
编辑假设不成立。
选项 #2:在加密驱动器上创建虚拟文件系统。 Ask Different 上的 This answer 展示了如何为此使用 MacZFS,但我不明白为什么你不能简单地使用 HFS+。
您可以在 shell 中执行此操作... find
将为您提供递归到子目录中的所有文件的列表,从 dot
开始 - 当前目录:
find .
输出
./vips/libvips/tools/vipsedit.c
./vips/libvips/tools/vipsheader.c
./vips/libvips/tools/vipsprofile
./vips/libvips/tools/vipsthumbnail.c
./vips/libvips/vips-cpp.pc.in
./vips/libvips/vips.pc.in
./vips/libvips/vipsCC.pc.in
然后awk
可以告诉你长度:
find . | awk '{l=length([=12=]);print length,[=12=]}'
输出
33 ./vips/libvips/tools/vipsheader.c
32 ./vips/libvips/tools/vipsprofile
36 ./vips/libvips/tools/vipsthumbnail.c
29 ./vips/libvips/vips-cpp.pc.in
25 ./vips/libvips/vips.pc.in
27 ./vips/libvips/vipsCC.pc.in
或者,如果您只想要长于 32 的那些:
find . | awk '{l=length([=14=]);if(length>32)print length,[=14=]}'
输出
43 ./vips/libvips/tools/batch_image_convert.in
42 ./vips/libvips/tools/batch_rubber_sheet.in
37 ./vips/libvips/tools/light_correct.in
36 ./vips/libvips/tools/shrink_width.in
33 ./vips/libvips/tools/vipsheader.c
36 ./vips/libvips/tools/vipsthumbnail.c
或者你可以使用这个:
find . | awk '{base=[=16=];sub(/.*\//,"",base);x=length(base);if(x>42)print [=16=],x,base}'
awk
获取$0中的整行,然后复制到base
。然后它会删除直到最后一个斜杠的所有内容并将其重新保存为 base
。然后它获取 base
的长度,如果大于 42,则显示完整的原始名称、基本名称的长度和基本名称本身。
find
工具支持正则表达式,这提供了一种按长度过滤文件的简便方法:
find -E . -regex '.*/[^/]{43,}'