ソースファイル: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 -i
ExTが必要なので、そうしたくありません)。$(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'
文字列にスペースを含めることができるので、引用符を使用します。