如何在 Mac OS 上查找超过 42 个字符的文件名

How to find filenames longer than 42 chars on Mac OS

我需要缩短外部硬盘驱动器上某些文件的名称,以便将它们存储在另一个加密驱动器上(加密不允许文件名超过 42 个字符)。我需要重命名的文件组织在具有任意子文件夹深度的多个文件夹中。

我正在考虑两种选择:

你能帮我做一些选择吗?或者您还有其他建议吗?

假设

您只想将加密驱动器用于备份而不是日常使用。

回答

创建 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,}'