删除目录和子目录中所有项目的空格

删除目录和子目录中所有项目的空格

我有一个包含文件和子目录的目录,其中一些目录的名称中包含空格。此外,每个子目录都包含名称中带有空格的文件。有没有一种简单的方法可以一次性删除父目录和所有子目录中所有名称中的空格?

答案1

使用该find命令枚举需要重命名的文件。为了提高性能,仅选择带空格的文件名。-depth在对目录本身进行操作之前,传递对子目录中的文件进行操作的选项,因为find在遍历目录时重命名目录将导致丢失某些目录。

find /path/to/directory -depth -name '* *' -exec … {} +

如果您有prename命令,它应用 Perl 表达式来重命名文件。您需要注意仅对文件的基本名称进行操作,而不是对整个目录路径进行操作。如果您find有此-execdir操作,这是执行此操作的便捷方法:

find /path/to/directory -name '* *' -execdir prename 's/ //g' {} +

Replace s/ //gbys/ /_/g用下划线替换空格,而不是直接删除它们,或者s/ +/_/g用单个下划线替换空格序列。

不需要-execdirPerl 代码中的目录避免逻辑。

find /path/to/directory -depth -name '* *' -exec prename '
    s:.*/::; $dir=$&;
    s/ //g;
    $_="$dir$_"
' {} +

如果没有prename,您可以使用 shell 脚本来完成此操作。您需要从 调用 shell find。如果您有 ksh,则可以使用其${file// /}构造来获取删除了空格的变量值file(使用${file// /_}下划线替换每个空格):

find /path/to/directory -depth -name '* *' -execdir ksh -c '
    mv "$0" "${0// /}"
' {} \;

或者

find /path/to/directory -depth -name '* *' -exec ksh -c '
    for file do
      dir=${file%/*};
      file=${x##*/};
      mv "$dir/$file" "$dir/${file// /}";
    done
' _ {} +

如果您有 bash 或 mksh,则可以使用它来代替 ksh。如果没有,您可以用来sed进行字符串处理。

find /path/to/directory -depth -name '* *' -exec sh -c '
    for file do
      dir=${file%/*};
      file=${x##*/};
      without_spaces=$(printf %s "$file." | sed "s/ //g")
      mv "$dir/$file" "$dir/${without_spaces%.}";
    done
' _ {} +

答案2

有没有一种简单的方法可以一次性删除父目录和所有子目录中所有名称中的空格?

就在这里:

find /tmp/ -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;

进一步阅读

祝你好运!

相关内容