从给定文件夹和子文件夹中的所有文件名中删除所有非法字符


4

我知道这基本上已经回答了,带有shell脚本(Sanitize Filenames)的automator工作得很好,但是我也需要它来做所有子文件夹。如果可能,在保留文件扩展名的同时将文件名减少到50个字符。我发现了一行bash代码截断了文件,但它也剥离了扩展名,并且在将这些文件从Mac传输到Windows时效果不佳。

现在的脚本是这样的

for f in "$1"/*; do
dir=$(dirname "$f")
file=$(basename "$f")
mv "$f" "${dir}/${file//[[:cntrl:]\\\/:*?\"<>|]/_}" 
done 

我并不反对在automator中使用applescript来完成这项任务。


注意:在unix / linux中有一个名为“rename”的可选命令,通过快速Google搜索,我发现mac有许多类似的命令。我想你应该检查这些命令。这些“重命名”命令使用 SED 表达式(正则表达式+其他)构造最终名称。
Giacomo Catenazzi

有没有办法让这个做子文件夹?我还试图将文件名修剪为30个字符,同时保留扩展名。有任何想法吗?我有这个:mv“$ f”“$ {dir} / $ {file:0:30}这很好用,但删除了我需要的扩展,因为文件正在传输到Windows系统。
Tim Moseley

1
我会做'像' {0,30}(\。[^​​。] )?$'作为正则表达式。使用重命名或“find | sed | bash”,在sed中我构造mv命令
Giacomo Catenazzi

Answers:


0

您可以使用 find。 OSX / Darwin的选项 find 与其他* nix变体略有不同,因此可能无法使用其中一些功能,但您可以获得要点,并可以使用您可用的选项:

find -regextype posix-extended -regex '.*\/[^\/]*[[:cntrl:]\\:*?"<>|].*' -print \
  -exec mv "{}" "$(echo "{}" | perl -ane 'chomp; s/[[:cntrl:]\\:*?"<>|]//g; print' -)"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.