補足解説集 (第13回)

課題について解説

backup

アプローチ1 * (ワイルドカード) と testコマンドを出発点に

アプローチ2(前半) lsコマンドを出発点に
アプローチ2(後半) 対象ファイル名がリストされてから

前節のコマンド列を使う方法として、以下の方法があり得るだろう。

  1. コマンド置換: 前節の出力を、コマンド置換で for のリストの場所に展開させる。

    for f in `ls -F|grep -v '[/@]$'|sed 's/*$//'` ; do
      cp "$f" "$f.bak"
    done
  2. while read で 1つずつ処理:

    read もコマンドで、

    前節の出力を while構文にパイプでつないで使う。

    ls -F | grep -v '[/@]$' | sed  's/*$//' |
    while read f ; do
        cp "$f" "$f.bak"
    done
  3. sed でコマンドの流れを作り、シェルに渡す。

    ls -F | grep -v '[/@]$' |
    sed  -e 's/*$//'  -e 's/\(.*\)/cp "\1" "\1.bak"/'  | sh
複数の .bak を作らない(.bakを対象からはずす)としたら
test -f "$f"  && ( expr "$f" : '.*[.]bak' || cp "$f" "$f.bak" )

expr "$f" : '.*[.]bak' || test -f "$f" && cp "$f" "$f.bak"

ls -F | grep -v '[/@]$' | sed 's/*$//'

ls -F | grep -v '[/@]$' | grep -v '.bak$' | sed 's/*$//'