Bash

遞歸地從文件和目錄名稱中刪除所有前導和尾隨空格

  • December 12, 2020

我的目錄結構如下:

.
├── 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/^ *//' {} +根本不起作用。

如何遞歸地從文件和目錄名稱中刪除所有前導和尾隨空格?

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’s 相反[[:space:]])僅匹配 ASCII 空白字元,而不匹配您語言環境中的其他空白字元。rename在開始重命名之前也沒有任何zmv保護措施來檢查衝突。

在任何情況下,請注意在幾個系統上,包括 GNU 系統,不間斷空格字元 (U+00A0) 不被視為空格,因為它不是用來分隔單詞的,所以它不會被刪除,即使與zmv 方法。如果你有這樣的字元,你可以去掉它們:

zmv -n '(**/)(*)' $'$1${${2##[[:space:]\ua0]#}%%[[:space:]\ua0]#}'

引用自:https://unix.stackexchange.com/questions/624073