我正在尝试为脚本编写一个循环,该循环检查特定目录中的任何特殊字符并将这些文件移动到特定目录(空格和连字符除外 - 这些只是用下划线替换并保留在该目录中,我已经得到该脚本已完成)。我已经研究了在这里和堆栈溢出上找到的几种可能性,它们非常匹配,但我无法让它们中的任何一个像我需要的那样工作。
for i in /home/*; do
case $i in
*\?*||*\**||*\$*||*\%*||*\.*||*\'*||*\"*||*\**||*\,* )
mv home/failed;
esac
done
如果有更短或更好的方法来完成此任务,那么它不一定是这样的。
提前谢谢你们,你们太棒了!我从 Stack Overflow、U&L 等网站上学到的实用信息比 IT 学士学位教给我的还要多。
答案1
这里要注意的是,unix 文件名可以包含除 '/' 和 '\0' 之外的任何 8 位字符值的字符。
如果要移动任何包含 [AZ] 或 [az] 以外的字符或下划线的文件,请使用以下命令:
for file in /home/*; do
filename=${file##*/}
[ -n "${filename//[A-Za-z_]/}" ] && mv "$file" failed/
done
它的工作原理是首先删除目录路径,只保留文件名。然后它从文件名中删除所有“合法”字符。如果仍有任何字符,则文件名包含非法字符,并将被移动。
答案2
这应该能够修改为在脚本中使用,但如果您是从命令行执行此操作,则可以这样做ls -i
。这将为目录中的每个文件提供索引节点。从中您可以使用 find:
find ./ -i $INODE -exec mv {} <target> \;