你好,我想从所有文件中删除所有正斜杠,但对主目录中的每个目录递归执行此操作。
我该如何修改这个非递归工作的脚本?
for f in "$1"/*; do
dir="$(dirname "$f")"
file="$(basename "$f")"
mv -- "$f" "${dir}/${file//[^_-0-9A-Za-z.]}"
done
或者更好的是,我只想替换文件名中的正斜杠,但这对于主文件夹中的每个子文件夹都适用?
问候 Max
答案1
在 BSD 层,正斜杠是路径分隔符。当您遇到带有正斜杠的文件名时,内核会将正斜杠转换/
为冒号:
。因此,Finder 应用程序中的文件名可能看起来像 ,foo/bar
但在 BSD 层中它看起来像foo:bar
。
因此,要遍历目录树,请使用find
来查找名称中包含 的文件:
。然后,使用内联脚本从-execdir
文件名中删除冒号(查找器应用程序中的正斜杠)。
find . -type f -name '*:*' -execdir bash -c ' for file
do
echo mv -- "${file}" "${file//:}"
done' sh {} \;
这将仅列出mv
命令和操作数。如果您认为输出将提供您想要的结果,则删除echo
。