Linuxとコマンドラインの基礎
$ ls
a.log b.log notes.txt
$ for f in *.log; do mv "$f" "${f%.log}.txt"; done上の操作の後で、ディレクトリにあるファイルとして、正しいものはどれか。
- Aa.log.txt、b.log.txt、notes.txt
- Ba.log、b.log、notes.txt のままで、a.log と b.log の中の「.log」という文字列が「.txt」に置き換わる
- Ca.txt、b.txt、notes.txt
答えと解説を見る
正解:C. a.txt、b.txt、notes.txt
for f in *.log は、*.log に一致する a.log と b.log を1つずつ変数 f に入れて、do と done の間を繰り返します。${f%.log} は、f の値の末尾から .log を取り除いた文字列なので、a.log なら a になり、mv "$f" "${f%.log}.txt" は a.log を a.txt に名前を変えます。notes.txt は *.log に一致しないので、そのまま残ります。"$f" を二重引用符で囲むのは、名前に空白が含まれていても1つの引数として mv に渡すためです。
- A. mv "$f" "$f.txt" と書いたときの結果です。${f%.log} は末尾の .log を取り除きます。
- B. mv はファイルの名前を変えるコマンドで、中身は変えません。中身を置き換えるのは sed などです。
- C. 正しい。末尾の .log を取り除いて .txt を付けた名前に変わります。