我有一个包含文件和子目录的目录,其中一些目录的名称中包含空格。此外,每个子目录都包含名称中带有空格的文件。有没有一种简单的方法可以一次性删除父目录和所有子目录中所有名称中的空格?
答案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/ //g
bys/ /_/g
用下划线替换空格,而不是直接删除它们,或者s/ +/_/g
用单个下划线替换空格序列。
不需要-execdir
Perl 代码中的目录避免逻辑。
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' "{}" \;
祝你好运!