長いファイル名の拡張子をすばやく変更するには?

長いファイル名の拡張子をすばやく変更するには?

ソースファイル:a really really long name with spaces.ext
ターゲットファイル:the same name.new-ext

注文する:mv *part of the name that'll give a unique answer.ext $(echo $(ls -l | grep -i *.ext | cut -d ' ' -f 11-))

結果:mv: target 'last word of the name.ext': No such file or directory

私は何が間違っていましたか?

PS:リモートシステムではこれだけを許可するのでsh(bashも許可しない)、タブの完成は不可能です。

答え1

次のことができます。

for f in *long*.ext; do mv -- "$f" "${f%.ext}.new-ext"; done

あるいは、ダッシュやbusybox ash(hushではない)を含む複数のシェルで、前のコマンド$_の最後の引数に展開されます。

echo *long*

正しいファイルが表示されていることを確認したら、次の手順を実行します。

mv -- "$_" "${_%.ext}.new-ext"

答え2

出力では、ファイル名の前のスペースの数はls -l非常に多様であり、通常10ではありません。文字も多様なのでcut -c安全ではありません。

lsしかし、それは必要ありません(grep -iExTが必要なので、そうしたくありません)。$(echo *blah.ext |sed s/ext$/new-ext$/)大丈夫です。

(修正済み)bash / ksh / zshでより良い方法f=(*ext); mv -- "$f" "${f%.ext}.new-ext"を考えてみましょう${#f[@]} -gt 1。 POSIX(例えば、dash、ash、busybox)に付いている場合set -- *blah.ext; if [ "$#" -eq 1 ]; then mv -- "$1" "${1%.ext}.new-ext"; else echo>&2 "error: $# files match"; fi

答え3

最も簡単な方法は、次のrenameコマンドを使用することです。

rename '.old' '.new' *'long'*'.old'

文字列にスペースを含めることができるので、引用符を使用します。

関連情報