我对此了解不多。下面的命令会删除所有文件名中的空格。
find . -type f -name "* *.*" -exec bash -c 'mv "$0" "${0// /}"' {} \;
我希望它也能删除逗号、句号和括号(
、、 和 ) ,但我不知道在命令中将我想要删除的字符放在哪里,
。 .
(
)
答案1
简短的回答是:从文件名中删除空格、逗号、句号和括号的命令 $0
是
mv "$0" "${0//[ ,.()]/}"
但不要用那个……
较长的答案:
您的
find
命令表示-name "* *.*"
. 这将选择名称至少包含一个空格的文件 后面至少跟一个句号。 不尝试处理名称不包含空格的文件是有道理的,因为如果没有空格,就没有什么可删除的。但我不知道为什么该命令要测试句点。它将重命名fat cat.txt
为fatcat.txt
,但会保留hot dog
和frank.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
删除“ ”后再次运行该命令。
顺便说一句,如果任何文件带有 .
其名称中的目录包含空格。