检测并删除文件或文件夹名称中的前导 space

Detect & remove leading space in file or folder name

我需要检测并删除文件夹和文件中的许多前导 space。

我尝试了一些代码,例如:

find /home/account -depth -name " *" -exec sh -c 'f="{}"; mv -v "$f" "...."' \;

但我找不到任何代码来从文件名或文件夹中删除前导 space。

我需要:

mv "/home/account/folder/ folder 1"  "/home/account/folder/folder 1"

(因为我使用查找,并让它检测子文件夹中的前导 space)

我如何使用上面提到的代码删除那些领先的 ​​space? 任何建议都会有所帮助。 顺便说一句,我正在使用 centos 7.

试试这个:

find /home/account -depth -name "* " | sed "s/\/ /\//g"

-name "* " 匹配名称中有 trailing space 的文件名。我在下面修复了这个问题,并使用 -execdir 使使用参数扩展更容易删除前导 space。

find /home/account -depth -name ' *' -execdir sh -c '
for f; do
    mv -v "$f" "${f#./[[:space:]]}"
done' _ {} +

对于干燥-运行 在 mv 之前加上 echo


如果可能有多个前导 space,那么方便的方法是在参数扩展中使用 extglob(这是一个 bash 扩展):

find /home/account -depth -name ' *' -execdir bash -c '
shopt -s extglob
for f; do
    mv -v "$f" "${f#./+([[:space:]])}"
done' _ {} +

您可以使用bash替换来提取文件名,并删除前导spaces。

小提示:模式 -name "* " 查找尾随 space(s) 的文件。如果您正在寻找前导 space(s) 的过滤器,请使用 -name " *",或寻找任何 space 而不是 -name "* * " 的过滤器。示例代码使用前导 space 模式。您可以根据需要调整 pattern 和 sed。

find /home/account -depth -name " *" | while read fn ; do
   d=${fn%/*}
   b=$(echo "${fn##*/}" | sed -e 's/^ *//')
   mv "$fn" "$d/$b"
done

使用rename

  • -name "* " :匹配名称中有尾随 space 的文件名
  • 重命名 's/ //gi' : 将 space 替换为空

-->

find /home/account -depth -name "* " | rename 's/ //gi'