ディレクトリ内のすべてのファイルの下線を空白に置き換えます。

ディレクトリ内のすべてのファイルの下線を空白に置き換えます。

ディレクトリ内のすべてのファイルについて、ファイル名の下線を空白に変更したいと思います。

私はこの解決策を試しましたが、私が望むものと反対の結果を得ました。https://stackoverflow.com/questions/1806868/linux-replacing-spaces-in-the-file-names

しかし、スペースは下線に変わりました。動作しないため、エラーが発生します。

´x´ is not a directory

たとえば、x はファイル名の最後の単語です。hello_world_x

ディレクトリ内のすべてのファイルで下線をスペースに置き換える正しいコマンドは何ですか?

答え1

CDを正しいディレクトリに移動すると、スクリプトはユーザーの要件を確実に解決します(拡張のために移植可能ではありません${var//pat/str})。

#!/bin/bash

set -- *_*
for file; do
    mv -- "$file" "${file//_/ }"
done

*_**_*globは名前に含まれるすべてのファイルを選択します。_

set --$1これらの名前(スペースや改行を含む)は、単純なコマンドなどで位置引数に安定して設定されます。$2set -- "list"

for file;これにより、各位置パラメータが順番にvarファイルに割り当てられます。

do ... done(それぞれについて)実行するコマンドが含まれています$file

mv -- "$file" "${file//_/ }"各ファイルを同じ名前に移動(名前変更)し、_それぞれ(すべて)を (スペース)に置き換えます。

ノート-i:既存のファイルを上書きしないように(対話型)オプションを追加できます。ファイルが存在するかどうかをmv尋ねます。 1つの注意点は、mvユーザーと通信できるインタラクティブシェルが必要であることです。

mv -i -- "$file" "${file//_/ }"

答え2

リンクした回答からコードをコピーしてより強力にしました。

for file in *; do mv "$file" "$(echo "$file" | tr '_' ' ')" ; done

mv引用符を付けると、各ファイル名はスペース境界で破損せずに単一のトークンに渡されます。

Perlベースの名前変更ユーティリティにアクセスできる場合は、以下も機能します。

rename -n 's/_/ /g' *

-nプレビューが必要なものと一致していることを確認したら、スイッチを取り外します。)

答え3

find . -depth -name "*_*" -exec \
    sh -cf '
        for f do   IFS=_
            IFS=\  set "${f%/*}/"${f##*/}$0
            mv "$f" "$*"
        done
    ' _ {} +

POSIX はsh構成変更を拡張します。内部フィールド区切り記号

関連情報