これは宿題です!
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
と、実際には何もしないで印刷物(近似値)を取得できます。