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

时间:2015-10-21 09:16:57

标签: macos shell automator

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

我正在考虑两种选择:

  • 有没有办法在Automator中获取文件名超过42个字符的文件列表?然后我会手工重命名 - 我不希望它们太多。
  • 是否有一个简单但强大的shell脚本,它将文件名裁剪为特定长度(对所有文件夹迭代,对所有子文件夹递归)?如果多个文件名的裁剪导致相同的文件名,它也应该能够处理冲突。

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

3 个答案:

答案 0 :(得分:2)

find工具支持正则表达式,它提供了一种按长度过滤文件的简便方法:

find -E . -regex '.*/[^/]{43,}'

答案 1 :(得分:1)

<强>假设

您只想使用加密的驱动器进行备份,而不是日常使用。

<强>答案

在备份驱动器上创建zip / tar.gz个文件以进行存储。这将保留文件的名称,权限和时间。

编辑假设没有成功。

选项#2:在加密的驱动器上创建虚拟文件系统。 Ask Different 上的This answer显示了如何使用MacZFS,但我不明白为什么你不能简单地使用HFS +。

答案 2 :(得分:1)

你可以在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($0);print length,$0}'

<强>输出

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($0);if(length>32)print length,$0}'

<强>输出

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=$0;sub(/.*\//,"",base);x=length(base);if(x>42)print $0,x,base}'

awk获取整行$ 0,然后将其复制到base。然后它将所有内容剥离到最后一个斜杠并重新保存为base。然后它获得base的长度,如果大于42,则显示完整的原始名称,基本名称的长度和基本名称。