我在ubuntu 14.04 linux机器上有文件,在目录中有无效的Windows字符,例如<>?:“| *等。我希望删除这些无效的Windows字符,以便它们可以从Windows机器也是如此。
例如:以下是目录中的几个文件:
file "1".html
file "asdf".txt
重命名后的预期输出应为:(实际上,它使用单个下划线重命名无效字符)
file _1_.html
file _asdf_.txt
我一直在运行来自Find files with illegal windows characters in the name on Linux的命令(稍微修改一下):
find . -name "*[<>\\|?:\"*]*" -exec bash -c 'x="{}"; y=$(sed "s/[<>\\|?:\"*]\+/_/g" <<< "$x") && echo "renaming" "$x" "-->" "$y" && mv "$x" "$y" ' \;
但是,上面的bash命令对包含双引号的文件失败。它适用于其他无效字符。
你能帮忙修复这个脚本吗?提前谢谢。
答案 0 :(得分:1)
使用bash
parameter expansion
$ touch 'file "1".html' 'file "asdf".txt' 'a<b' 'f?r' 'e*w' 'z|e' 'w:r' 'b>a'
$ ls
a<b b>a e*w file "1".html file "asdf".txt f?r w:r z|e
$ find -name "*[<>\\|?:\"*]*" -exec bash -c 'echo mv "$0" "${0//[<>\\|?:\"*]/_}"' {} \;
mv ./z|e ./z_e
mv ./file "asdf".txt ./file _asdf_.txt
mv ./a<b ./a_b
mv ./file "1".html ./file _1_.html
mv ./e*w ./e_w
mv ./w:r ./w_r
mv ./f?r ./f_r
mv ./b>a ./b_a
$ find -name "*[<>\\|?:\"*]*" -exec bash -c 'mv "$0" "${0//[<>\\|?:\"*]/_}"' {} \;
$ ls
a_b b_a e_w file _1_.html file _asdf_.txt f_r w_r z_e
使用extglob
$ touch 'tmp::<>|asdf.txt'
$ find -name "*[<>\\|?:\"*]*" -exec bash -c 'shopt -s extglob; echo mv "$0" "${0//+([<>\\|?:\"*])/_}"' {} \;
mv ./tmp::<>|asdf.txt ./tmp_asdf.txt
基于perl
rename
$ find -name "*[<>\\|?:\"*]*" -exec rename 's/[<>\\|?:\"*]/_/g' {} +
$ ls
a_b b_a e_w file _1_.html file _asdf_.txt f_r w_r z_e
使用rename -n
进行干运行而不实际重命名文件
$ touch 'tmp::<>|asdf.txt'
$ find -name "*[<>\\|?:\"*]*" -exec rename -n 's/[<>\\|?:\"*]+/_/g' {} +
rename(./tmp::<>|asdf.txt, ./tmp_asdf.txt)