ディレクトリ内のすべてのファイル名の文字を変更する

ディレクトリ内のすべてのファイル名の文字を変更する

これは宿題です!

yayファイル名のすべてのスペースをディレクトリの下線に置き換えようとします。 $(command)を使用せずにxargsおよびshコマンドを使用する必要があります。コマンドラインを試しましたが、引き続き次のメッセージが表示されます。

sh: 1: Bad substitution

このメッセージが引き続き表示される理由を説明できる人はいますか?

私が使用するのに疲れたコマンドは次のとおりです。

find yay -type f -print0 | xargs -0 -I {} sh -c 'newname="${1// /_}"; mv "$1" "$newname"' sh

そして

find yay -type f -exec sh -c 'mv "$1" "${1// /_}"' _ {} \;

ベストアンサー1

シェルは代替をsh理解していません/。 (しかし、%andは理解しています#。)次のシェルが必要ですbash

find yay -type f -exec bash -c 'mv -- "$1" "${1// /_}"' _ {} \;

シェル呼び出しの数(現在のファイルごとに1回)を減らし、ターゲットがまだ存在しない場合にのみファイル名を変更すると、より効率的に作成できます。

find yay -type f -name '* *' -exec bash -c 'for f in "$@"; do g=${f// /_}; [ ! -e "$g" ] && mv -f -- "$f" "$g"; done' _ {} +

テスト時にmvプレフィックスを追加するechoと、実際には何もしないで印刷物(近似値)を取得できます。

おすすめ記事