递归替换特殊字符 bash
Replace special characters recursively bash
我正在尝试查找某个文件夹和所有子文件夹中的所有文件和文件夹,并替换所有特殊字符。所有空格都应替换为点,其他所有内容都应删除。我尝试了几种不同的方法,但是当我使用 "mv" 时,它似乎没有保留目录结构,当我将 "rename" 与 "find" 一起使用时,它不想去递归地。
我得到的最接近的是:
for f in **/; do mv "$f" `echo $f | tr " " . | tr -dc '[:alnum:].'`; done
但我认为循环在某处被破坏,因为它将文件名加在一起并将结果放在父目录中。
你可以这样做:
find . -depth -execdir rename 's/\s/./g; s/[^[:alnum:]./]//g' {} +
这里有几点:
-depth
-- 深度优先遍历目录层次结构。这确保您在重命名文件夹 之前 重命名文件夹中的文件
-execdir
-- 在子目录 中执行命令 -- {}
现在将是 ./filename
而不是 ./dir1/dir2/filename
- 这是 perl 风格的
rename
,请查看您的手册页。
我正在尝试查找某个文件夹和所有子文件夹中的所有文件和文件夹,并替换所有特殊字符。所有空格都应替换为点,其他所有内容都应删除。我尝试了几种不同的方法,但是当我使用 "mv" 时,它似乎没有保留目录结构,当我将 "rename" 与 "find" 一起使用时,它不想去递归地。
我得到的最接近的是:
for f in **/; do mv "$f" `echo $f | tr " " . | tr -dc '[:alnum:].'`; done
但我认为循环在某处被破坏,因为它将文件名加在一起并将结果放在父目录中。
你可以这样做:
find . -depth -execdir rename 's/\s/./g; s/[^[:alnum:]./]//g' {} +
这里有几点:
-depth
-- 深度优先遍历目录层次结构。这确保您在重命名文件夹 之前 重命名文件夹中的文件
-execdir
-- 在子目录 中执行命令 --{}
现在将是./filename
而不是./dir1/dir2/filename
- 这是 perl 风格的
rename
,请查看您的手册页。