从文件名中删除特殊字符
Remove special chars from filenames
我需要从文件名中删除所有特殊字符。
类似于find . -mindepth 1 -exec rename 's/[^a-zA-Z0-9_-]//g' {} \;
,但是当重命名命令重命名目录时,查找打印关于没有这样的文件或目录(旧目录名称)的错误。
我需要允许点。
这将满足您的需求:
#!/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
解释
这个 -d '[:graph:]'
会说删除所有可打印的内容,而 -C 会相反:tr -C -d '[:graph:]'
这将重命名文件:mv "$file" "$new_faile_name"
注意:如果您只允许大写和小写字母以及下划线、连字符和点,则可以这样做:tr -C -d '[a-zA-Z-_.]'
此致!
根据@matias-barrios的回答,我写了自己的解决方案:
#!/bin/bash
fileList=$(find . -mindepth 1)
echo "$fileList" | awk '{print length, [=10=]}' | 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
我需要从文件名中删除所有特殊字符。
类似于find . -mindepth 1 -exec rename 's/[^a-zA-Z0-9_-]//g' {} \;
,但是当重命名命令重命名目录时,查找打印关于没有这样的文件或目录(旧目录名称)的错误。
我需要允许点。
这将满足您的需求:
#!/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
解释
这个 -d '[:graph:]'
会说删除所有可打印的内容,而 -C 会相反:tr -C -d '[:graph:]'
这将重命名文件:mv "$file" "$new_faile_name"
注意:如果您只允许大写和小写字母以及下划线、连字符和点,则可以这样做:tr -C -d '[a-zA-Z-_.]'
此致!
根据@matias-barrios的回答,我写了自己的解决方案:
#!/bin/bash
fileList=$(find . -mindepth 1)
echo "$fileList" | awk '{print length, [=10=]}' | 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