Bash - スペースをアンダースコアに置き換え、複数のスペースを1つに置き換えます。

Bash - スペースをアンダースコアに置き換え、複数のスペースを1つに置き換えます。

私はrenameファイル名のスペースに下線を引くのに慣れています。以下を使用してください。

rename "s/ /_/g" * 

ところで問題が発生しました。インターネットからダウンロードしたファイルには複数のスペースがあることがよくあります。私は不快な解決策を使用しましたが(ほとんどの場合は3つのスペースでのみ機能します)、次のものよりもエレガントな方法が必要です。

rename "s/   /_/g" *; rename "s/  /_/g" *; rename "s/ /_/g" *

答え1

以下は私にとって効果的でした。

rename 's/\s+/_/g' *

空白の1つのインスタンスから無限のインスタンスまで一致します。

これは改行やタブでも機能しますが、ユースケースに応じてこれがより良く不要ではないと思いますか?ただし、スペースを具体的に一致させるには、次のようにします。

rename 's/ +/_/g' *

答え2

IDKはrename再帰的に動作します。空白のないサブディレクトリと、空白のあるサブディレクトリに名前に空白を含む空のファイルを作成しました。以下のコードは、アンダースコアを使用して名前に1つ以上のスペースを含むファイルの名前を変更するのに効果的であり、名前にスペースを含むサブディレクトリを妨げません。

root@server <1>: /cwd# mkdir subdir1 'sub dir 2' ; touch 'subdir1/file 1' 'sub dir 2/file  2  ' 'subdir1/ f i l e 3 ' 'sub dir 2/   f  i  l  e   4   '

root@server <2>: /cwd# ls -lhR
.:
total 0
drwxr-xr-x 2 root root 80 Dec 28 00:42  subdir1
drwxr-xr-x 2 root root 80 Dec 28 00:42 'sub dir 2'

./subdir1:
total 0
-rw-r--r-- 1 root root 0 Dec 28 00:42 'file 1'
-rw-r--r-- 1 root root 0 Dec 28 00:42 ' f i l e 3 '

'./sub dir 2':
total 0
-rw-r--r-- 1 root root 0 Dec 28 00:42 'file  2  '
-rw-r--r-- 1 root root 0 Dec 28 00:42 '   f  i  l  e   4   '

root@server <3>: /cwd# find . -type f -exec echo {} \; | tee ../FILES.txt
./sub dir 2/   f  i  l  e   4
./sub dir 2/file  2
./subdir1/ f i l e 3
./subdir1/file 1

root@server <4>: /cwd# while IFS= read line ; do
> dirname="${line%/*}"
> fn=${line##*/}
> fn="${fn//+( )/_}"
> mv -v "$line" "${dirname}/${fn}"
> done < ../FILES.txt
renamed './sub dir 2/   f  i  l  e   4   ' -> './sub dir 2/_f_i_l_e_4_'
renamed './sub dir 2/file  2  ' -> './sub dir 2/file_2_'
renamed './subdir1/ f i l e 3 ' -> './subdir1/_f_i_l_e_3_'
renamed './subdir1/file 1' -> './subdir1/file_1'

root@server <5>: /cwd# ls -lhR
.:
total 0
drwxr-xr-x 2 root root 80 Dec 28 00:42  subdir1
drwxr-xr-x 2 root root 80 Dec 28 00:42 'sub dir 2'

./subdir1:
total 0
-rw-r--r-- 1 root root 0 Dec 28 00:42 file_1
-rw-r--r-- 1 root root 0 Dec 28 00:42 _f_i_l_e_3_

'./sub dir 2':
total 0
-rw-r--r-- 1 root root 0 Dec 28 00:42 file_2_
-rw-r--r-- 1 root root 0 Dec 28 00:42 _f_i_l_e_4_

各コマンドに関するいくつかの注意事項:

  1. 名前にスペースを含む2番目のサブディレクトリを持つ2つのサブディレクトリを作成します。

  2. コンテンツを再帰的に一覧表示します。スペースを含むファイルまたはフォルダには一重引用符が使用されます。

  3. findファイル(-type f)を検索し、名前を親ディレクトリの「FILES.txt」に反映するために使用されます。

  4. ループを使用してwhileファイルの各行を繰り返します。IFS=先頭と末尾の空白が切り捨てられないように、入力フィールド区切り文字を消去します。

    4.1ディレクトリ名を抽出して変更しないでください。

    4.2 ファイル名のインポート

    4.3 ファイル名内の1つ以上の連続した空白文字を単一の下線に置き換える

    4.4ファイル名を詳細に変更しますが、フォルダ名は変更しないでください。

  5. コンテンツを再帰的に一覧表示します。スペースを含むファイルまたはフォルダには一重引用符が使用されます。

パラメータ拡張を使用してディレクトリ名とファイル名を取得する方が高速なので、代わりに使用していdirnameますbasename

関連情報