Bash
遞歸地從文件和目錄名稱中刪除所有前導和尾隨空格
我的目錄結構如下:
. ├── 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]#}'