gpt4 book ai didi

linux - 递归 "normalize"文件名

转载 作者:IT王子 更新时间:2023-10-29 01:01:03 25 4
gpt4 key购买 nike

我的意思是去掉文件名等中的特殊字符。

我制作了一个脚本,可以递归地重命名文件 [http://pastebin.com/raw.php?i=kXeHbDQw]:

例如:之前:

THIS i.s my file (1).txt

运行脚本后:

This-i-s-my-file-1.txt

好的。这是:

但是:当我想“完全”测试它时,使用这样的文件名:

¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÂÃÄÅÆÇÈÊËÌÎÏÐÑÒÔÕ×ØÙUÛUÝÞßàâãäåæçèêëìîïðñòôõ÷øùûýþÿ.txt
áíüűúöőóéÁÍÜŰÚÖŐÓÉ!"#$%&'()*+,:;<=>?@[\]^_`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£.txt

失败 [http://pastebin.com/raw.php?i=iu8Pwrnr]:

$ sh renamer.sh directorythathasthefiles
mv: cannot stat `./áíüűúöőóéÁÍÜŰÚÖŐÓÉ!"#$%&\'()*+,:;<=>?@[]^_`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£': No such file or directory
mv: cannot stat `./áíüűúöőóéÁÍÜŰÚÖŐÓÉ!"#$%&\'()*+,:;<=>?@[]^_`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£': No such file or directory
mv: cannot stat `./áíüűúöőóéÁÍÜŰÚÖŐÓÉ!"#$%&\'()*+,:;<=>?@[]^_`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£': No such file or directory
mv: cannot stat `./áíüűúöőóéÁÍÜŰÚÖŐÓÉ!"#$%&\'()*+,:;<=>?@[]^_`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£': No such file or directory
mv: cannot stat `./áíüűúöőóéÁÍÜŰÚÖŐÓÉ!"#$%&\'()*+,:;<=>?@[]^_`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£': No such file or directory
mv: cannot stat `./áíüűúöőóéÁÍÜŰÚÖŐÓÉ!"#$%&\'()*+,:;<=>?@[]^_`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£': No such file or directory
mv: cannot stat `./áíüűúöőóéÁÍÜŰÚÖŐÓÉ!"#$%&\'()*+,:;<=>?@[]^_`{|}~€‚ƒ„…†....and so on
$

所以“mv”不能处理特殊字符.. :\

我为此工作了好几个小时..

有人有工作的吗? [也可以处理那两行中的字符 [文件名] 吗?]

最佳答案

mv 可以很好地处理特殊字符。你的脚本没有。


排名不分先后:

  1. 您正在使用find 查找所有目录,并分别ls 每个目录。

    1. 如果您可以用一个命令做到完全,为什么要使用用于DEPTH in...

      find -maxdepth 100 -type d
    2. 这使得任意深度限制变得不必要

      find -type d
    3. 永远不要解析ls的输出,尤其是如果你能让find也处理一下

      find -not -type d
    4. 确保它能在最坏的情况下工作:

      find -not -type d -print0 | while read -r -d '' FILENAME; do

      这会阻止 read 吃掉某些转义符并阻止包含换行符的文件名。

  2. 您正在重复整个 ls |为每个字符 替换 循环。 不要 - 它会降低性能。遍历每个目录所有文件一次,并且只使用多个sed,或者在一个sed 中使用多个替换命令。

    sed 's/á/a/g; s/í/i/g; ...'

    (我打算建议 sed 'y/áí/ai/',但不幸的是,这似乎不适用于 Unicode。也许 perl -CS -Mutf8 -pe ' y/áí/ai/' 会。)

  3. 您仍在用 ASCII 思考:“其他特殊字符 - ASCII 代码 33.. ..255”。不要。

    1. 如今,大多数系统都使用 UTF-8 编码的 Unicode,它具有范围更广的“特殊”字符 - 如此之多以至于一个一个地列出它们变得毫无意义。 (它甚至是多字节——“e”是一个字节,“ė”是三个字节。)

    2. 真正的 ASCII 有 128 个字符。您目前想到的是 ISO 8859 字符集(有时称为“ANSI”)——尤其是 ISO 8859-1。但它们一直上升到 8859-16,只有“ASCII”部分保持不变。

  4. echo -n $(command) 没什么用。

  5. 有更简单的方法可以在给定路径的情况下查找目录和基本名称。例如,你可以这样做

    directory=$(dirname "$path")
    oldnname=$(basename "$path")
    # filter $oldname
    mv "$path" "$directory/$newname"
  6. 不要使用egrep 检查错误。检查程序的返回码。 (就像您已经使用 cd 一样。)

  7. 而不是过滤掉其他错误,做...

    if [[ -e $directory/$newname ]]; then
    echo "target already exists, skipping: $oldname -> $newname"
    continue
    else
    mv "$path" "$directory/$newname"
    fi
  8. 大量的 sed 's/------------/-/g' 调用可以更改为单个正则表达式:

    sed -r 's/-{2,}/-/g'
  9. tr [foo] [bar] 中的 [ ] 是不必要的。它们只是导致 tr[ 替换为 [,并将 ] 替换为 ]

  10. 认真的吗?

    echo "$FOLDERNAME" | sed "s/$/\//g"

    这个怎么样?

    echo "$FOLDERNAME/"

最后,使用 detox .

关于linux - 递归 "normalize"文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4721249/

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