从文件名中删除特殊字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从文件名中删除特殊字符相关的知识,希望对你有一定的参考价值。

我需要从文件名中删除所有特殊字符。

find . -mindepth 1 -exec rename 's/[^a-zA-Z0-9_-]//g' {} ;之类的东西但是当重命名命令重命名dir find时会打印关于没有这样的文件或目录(旧目录名称)的错误。

我需要允许点。

答案

这将满足您的需求:

#!/bin/bash

for file in $(find /yourdirhere -type f 2>/dev/null);
do
    new_faile_name=$( echo "$file" | tr -C -d '[:graph:]' );
    mv "$file" "$new_faile_name"
done

EXplanation

这个-d '[:graph:]'会说删除所有可打印的内容,-C将反转:tr -C -d '[:graph:]'

这将重命名文件:mv "$file" "$new_faile_name"

Note : This will do if you want only yo allow capital and lowercase letters plus underscores, hyphens and dots : tr -C -d '[a-zA-Z-_.]'

问候!

另一答案

根据@ matias-barrios的答案,我编写了自己的解决方案:

#!/bin/bash
fileList=$(find . -mindepth 1)
echo "$fileList" | awk '{print length, $0}' | sort -rn | cut -d" " -f2- | 
while read path; do 
  dirName=$(echo "$path" | rev | cut -d'/' -f2- | rev)
  fileName=$(echo "$path" | rev | cut -d'/' -f1 | rev)
  newFileName="$dirName/$(echo "$fileName" | tr -C -d 'a-zA-Z0-9-_.')"
  if [ "$path" = "$newFileName" ]; then continue; fi;
  echo "From: $path"
  echo "To: $newFileName"
  mv "$path" "$newFileName"
done

以上是关于从文件名中删除特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

使用 spark 从 csv 文件中删除所有特殊字符

删除行时文本文件中的特殊字符

从文件名中删除特殊字符

比较 C# 中的字符串片段并从集合中删除项目

如何删除html特殊字符?

XSS:如何从 C# 中的字符串中删除 JS 片段?