将双引号替换为linux

时间:2016-10-11 16:49:18

标签: regex linux bash sed find

我在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命令对包含双引号的文件失败。它适用于其他无效字符。

你能帮忙修复这个脚本吗?提前谢谢。

1 个答案:

答案 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)