gpt4 book ai didi

regex - 在 Linux 文件名中替换双引号以及其他无效的 Windows 文件名字符

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:34 25 4
gpt4 key购买 nike

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

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

最佳答案

使用 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


使用基于 perlrename

$ 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)

关于regex - 在 Linux 文件名中替换双引号以及其他无效的 Windows 文件名字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39982512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com