从文件名中删除某些字符

从文件名中删除某些字符

我对此了解不多。下面的命令会删除所有文件名中的空格。

find . -type f -name "* *.*" -exec bash -c 'mv "$0" "${0// /}"' {} \;

我希望它也能删除逗号、句号和括号(   、、 和  )   ,但我不知道在命令中将我想要删除的字符放在哪里,。 .()

答案1

简短的回答是:从文件名中删除空格、逗号、句号和括号的命令 $0

mv "$0" "${0//[ ,.()]/}"

但不要用那个……

较长的答案:

  • 您的find命令表示-name "* *.*". 这将选择名称至少包含一个空格的文件 后面至少跟一个句号。  不尝试处理名称不包含空格的文件是有道理的,因为如果没有空格,就没有什么可删除的。但我不知道为什么该命令要测试句点。它将重命名fat cat.txtfatcat.txt,但会保留hot dogfrank.fur ter不变。

    由于您想要重命名名称中带有句点的文件(删除句点),因此您应该将-name测试更改为 -name "*[ ,.()]*"

  • 当您处理事先不知道的文件名时,最好将其放在 --第一个文件名之前。有人可能会说,当您这样做时,这并非绝对必要find . … -exec …,但这是一个好习惯。

  • 如果您有名为fat cat.txt和 的文件f a t c a t.txt,它们都将被重命名为fatcat.txt,并且第二个文件将破坏第一个文件。将-n(no-clobber) 选项传递给mv 可以防止这种情况发生。但请注意:它将使文件名称中带有空格(等),甚至可能不会告诉您存在问题!

  • 当前命令会bash为每个文件调用一个新进程。这可能会导致执行时间超过必要时间。最好先调用bash一次,然后再调用mv多次。因此,综合以上所有情况,我们有

    find . -type f -name "*[ ,.()]*" -exec bash -c 'mv -n -- "$1" "${1//[ ,.()/}"' sh {} +
    

    但是等一下!我们还没有完成!不要使用上面的内容。

  • find执行命令(使用 -exec)时,它会将文件的路径名传递给命令。如果您fat cat.txt当前目录中有一个名为 的文件, find将传递./fat cat.txt给 bash 命令。上述命令将尝试将fat cat.txt( ./fat cat.txt) 重命名为 /fatcattxt。如果您以 root 身份运行(即 sudo),这会将您的文件移动到根目录,造成很大的混乱。(教训:除非您确定需要,否则不要在 下运行命令sudo。)如果您不是以 root 身份运行,那么“好消息”是该命令将不执行任何操作。

    所以现在,把所有这些放在一起,我们得到

    find . -type f -name "*[ ,.()]*" -exec bash -c 'for f do dir="$(dirname "$f")"; base="$(basename "$f")"; echo mv -n -- "$f" "$dir/${base//[ ,.()]}"; done' sh {} +
    

    请注意,我echo在上面添加了一个命令,作为“三思而后行”的措施。如果您运行上述命令,它将显示所有mv需要的命令。如果您觉得没问题,请echo删除“ ”后再次运行该命令。


顺便说一句,如果任何文件带有 .其名称中的目录包含空格。

相关内容