ブレース展開を使用して、ファイルを別の名前で同じディレクトリにコピーしようとしています。私はbash 4.4.18を使用しています。
これが私がしたことです:
cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}
しかし、私はこのエラーを受け取ります:
cp: cannot stat '/home/xyz/some/dir/{my-file-to-rename.bin,': No such file or directory
このような単純なブレース展開でも同じエラーが発生します。
cp {my-file-to-rename.bin, new-name-of-file.bin}
何が悪いのですか?
ブレース展開 構文はコンマを受け入れますが、コンマの後のスペースは受け入れません。多くのプログラミング言語では、コンマの後のスペースは当たり前ですが、ここにはありません。 Bashでは、引用符で囲まれていないスペースが存在するため、ブレースの展開を実行できません。
スペースを削除すると、機能します。
cp ~/some/dir/{my-file-to-rename.bin,new-name-of-file.bin}
必須ではありませんが、末尾の.bin
を中括弧の外に移動できることに注意してください。
cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
ブレース展開の効果をテストする場合は、echo
またはprintf '%s '
、または printf
を使用して、任意のフォーマット文字列を使用して、それ。 (私がBashにいるときは、個人的にはecho
を使用します。これは Bashのecho
ビルトイン がデフォルトでエスケープシーケンスを拡張しないため、かなり適切です。実際に実行されるコマンドを確認するのに適しています。例:
ek@Io:~$ echo cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
cp /home/ek/some/dir/my-file-to-rename.bin /home/ek/some/dir/new-name-of-file.bin
string{foo, bar}
はブレース展開ではありません。 2つの単語string{foo,
およびbar}
。ブレース展開を使用するには、ブレースが同じWord内にある必要があります。不要な場合は余分なスペースを削除するか、必要な場合は引用符で囲む必要があります。
$ printf "%s\n" aa{bb, cc}
aa{bb,
cc}
$ printf "%s\n" aa{bb,cc}
aabb
aacc
$ printf "%s\n" aa{bb," cc"}
aabb
aa cc