我的目录结构如下所示:
.
├── ParentDirectory
│ ├── ChildDirectory1
│ │ ├── 01-File.txt
│ │ ├── 02-File.txt
│ │ ├── 03-File.adoc
│ │ ├── 04-File.md
│ │ └── 05-File.txt
│ ├── ChildDirectory2
│ │ ├── 01-File.txt
│ │ ├── 02-File.txt
│ │ ├── 03-File.adoc
│ │ ├── 04-File.txt
│ │ ├── 05-File.txt
│ │ └── 06-File.md
│ ├── ChildDirectory3
│ │ ├── 01-File.txt
│ │ ├── 02-File.txt
│ │ ├── 03-File.adoc
│ │ ├── 04-File.md
│ │ ├── 05-File.md
│ │ └── 06-File.txt
您可能已经注意到,某些文件和目录有前导空格。您可能没有注意到的是,一些文件和目录也有尾随空格。
对于尾随空格,我尝试了:
% find . -exec rename 's/ *$//' {} +
我必须多次运行这个命令。在第一次运行时,重命名父目录。在第二次运行时,它会重命名该孩子。我的目录结构实际上要深得多。因此,多次运行命令并不是一个好的解决方案。
对于前导空格,find . -exec rename 's/^ *//' {} +
根本不起作用。
如何递归地从文件名和目录名中删除所有前导和尾随空格?
发布于 2020-12-11 23:46:41
使用zsh
:
autoload -Uz zmv # best in ~/.zshrc
zmv -n '(**/)(*)' '$1${${2##[[:space:]]#}%%[[:space:]]#}'
(如果高兴,请删除-n
(试运行))。
如果还想处理隐藏目录中的隐藏文件和文件,请在模式的末尾添加一个(#qD)
。
对于rename
,这可能是这样的:
find . -depth ! -name . -exec rename -n '
my ($dir, $base) = m{(.*)/(.*)}s;
$base =~ s/^\s*//;
$base =~ s/\s*$//;
$_ = "$dir/$base";' {} +
不过请注意,\s
(与zsh的[[:space:]]
相反)只匹配ASCII空格,而不匹配区域设置中的其他空格字符。在重新命名之前,rename
也没有任何zmv
's‘的安全措施来检查冲突。
无论如何,请注意,在一些系统中,包括GNU系统,非突破性空格字符(U+00A0)不被视为空白,因为它不是用来分隔单词的,所以即使使用zmv
方法也不会删除。如果您有这样的字符,您可以用以下内容剥去它们:
zmv -n '(**/)(*)' $1${${2##[[:space:]\ua0]#}%%[[:space:]\ua0]#}'
https://unix.stackexchange.com/questions/624073
复制相似问题