ファイル名とディレクトリ名からすべての先頭と末尾のスペースを繰り返し削除します。

ファイル名とディレクトリ名からすべての先頭と末尾のスペースを繰り返し削除します。

私のディレクトリ構造は次のとおりです。

.
├── 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]#}'

おすすめ記事