【发布时间】:2020-06-26 10:02:11
【问题描述】:
我正在尝试在保留扩展名的同时缩短文件名。
我认为cut 可能是最好的工具,但我不确定如何保留文件扩展名。
例如,我正在尝试将 abcdefghijklmnop.txt 重命名为 abcde.txt
我想简单地去掉文件名的末尾,以便总字符长度不超过 [在本例中] 5 个字符。
我不担心文件名冲突,因为我的数据集可能不包含任何内容,无论如何我会在重命名之前查找、分析文件并进行测试。
这最终的背景是我想批量截断超过 135 个字符的文件名,以便我可以将文件重新同步到 Synology NAS 上的加密共享。
我找到了一种搜索所有超过 135 个字符的文件名的好方法:
find . -type f | awk -F'/' 'length($NF)>135{print $0}'
我想通过管道将它传递给一个简单的剪切命令,以将文件名缩小到合适的大小。也许有比这更好的方法。我找到了shorten filenames while preserving extensions的方法,但我需要递归所有子目录。
任何帮助将不胜感激,谢谢!
更新说明:
我想使用语法如下的单行:
find . -type f | awk -F'/' 'length($NF)>135{print $0}' | some_code_here_to_shorten_the_filename_while_preserving_the_extension
【问题讨论】:
-
是否担心您的缩短方法可能会导致文件名不唯一?
-
好问题@jas,不,我不担心。使用我的数据集,不可能创建重复的名称。而且无论如何,我会提前找到所有长文件名并在运行脚本之前对其进行分析。
-
您能否编辑您的问题以添加说明和/或伪代码来显示您希望如何重命名文件?您真的只想取基本名称的前五个字符 + 扩展名吗?
-
谢谢@jas 我更新了问题。我正在尝试制作这样的单行:
find . -type f -iname "*" |awk -F'/' 'length($NF)>135{print $0}' | some_code_here,以便它通过子目录递归并删除所有长文件名的结尾。 -
注意
-iname "*"没有效果;如果你实际上根本没有按文件名过滤,你可以写find -type f。