作業ディレクトリにdjvuファイルが1つしかないとします。.bk
ファイル名の末尾に追加の内容を含むファイルにファイルをバックアップしたいと思います。cp *.djvu{,.bk}
djvuファイルをというファイルにコピーします*.djvu.bk
。*
バックアップファイル名に拡張子がないのはなぜですか?どうやって?
ベストアンサー1
何が起こるかは、bashが最初に拡張され、次に*.djvu{,.bk}
glob*.djvu
*.djvu.bk
が拡張されることです。これはあなたが観察しているものを説明します。あなたの場合は、*.djvu
既存のファイルと一致し、foo.djvu
そのファイルに拡張されますが、*.djvu.bk
どのファイルとも一致しないため、独自に拡張されます*.djvu.bk
。
拡張順序は bash 文書で指定されています。
The order of expansions is: brace expansion, tilde expansion, parame‐
ter, variable and arithmetic expansion and command substitution (done
in a left-to-right fashion), word splitting, and pathname expansion.
コピーコマンドを次のように書き直すことをお勧めします。
for f in *.djvu; do cp -- "$f" "$f".bk; done
または、明示的なforループの構文オーバーヘッドを回避するには、次の手順を実行します。
parallel -j1 cp -- {} {}.bk ::: *.djvu
(もう一度考えてみてください。それほど短いわけではありません。)
「拡張方法」というサブ質問に答えるには、サブコマンドを使用できます(例:およびのみを含むfoo.djvu
ディレクトリからbar.djvu
)。
$ echo $(echo *.djvu){,.bk}
bar.djvu foo.djvu bar.djvu foo.djvu.bk
ただし、これは上記のforループや並列呼び出しほど安全ではありません。スペースを含むファイル名では競合が発生します。