私のディレクトリ構造は次のとおりです。
.
├── 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/ *$//' {} +
このコマンドを複数回実行する必要があります。初めて実行すると、親ディレクトリの名前が変更されます。 2回目の実行では、サブ名が変更されます。私のディレクトリ構造は実際にははるかに深いです。したがって、コマンドを複数回実行するのは良い解決策ではありません。
先行スペースではまったく機能しませんfind . -exec rename 's/^ *//' {} +
。
ファイル名とディレクトリ名からすべての先行スペースと末尾のスペースを再帰的に削除するには?
ベストアンサー1
そして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
とにかく、GNUシステムを含むいくつかのシステムでは、改行防止空白文字(U + 00A0)は単語を区切るために使用されないため、空白と見なされないため、zmv
メソッドを使用しても削除されません。これらの文字がある場合は、以下を使用して削除できます。
zmv -n '(**/)(*)' $'$1${${2##[[:space:]\ua0]#}%%[[:space:]\ua0]#}'