ファイル名の「/」を「_」に置き換える方法

ファイル名の「/」を「_」に置き換える方法

各マウントポイントのバックアップtarファイルを作成しています。

/var
/usr/image
/usr/image/temp

次のようなtarnameを作成しようとしています。

backup_var_date.tar
backup_usr_image_date.tar
backup_usr_image_temp_date.tar

以下のように試しましたが、「mv」は機能しません。 "$i は for ループで呼び出される変数です。"

/bin/tar -cvpzf backup_`echo`mv "$i" "${i//"/"/_}``_`hostname`.`date +%m.%d.%Y`.tar.gz 

答え1

奇妙に見えます。

backup_`echo`mv "$i" "${i//"/"/_}``_`hostname`.`date +%m.%d.%Y`.tar.gz 

mvここに巣を入れたいですかecho?コマンド代替構文を使用すると、$(...)ネストが簡単になります。

backup_$(echo $(mv this that))_$(hostname)...

しかし、出力を繰り返すだけで動作する場合は、何も出力してはならないmvということは言うまでもなく、ここではまだ何の用途も見えません。echomv

キャンセルしmvてビルドファイル名を使用すると、変数のすべての${var//\//_}インスタンスが変更されます。/_

したがって、ループ全体に対して次のように見えることがあります。

for path in /var /usr/image /usr/image/temp ; do
    x=$(path#/}                      # remove leading / if there is one
    tarfile=backup_${x//\//_}_$(hostname)_$(date +%Y-%m-%d).tar.gz
    tar -cvpzf "$tarfile" "$path"
done

注:日付形式をからに変更したのは、後者がソートをより簡単にする05-17-2017ためです。2017-05-17先行を取り除くことはとにかく私たちが望むものに/変わるので重複しますが、_この方法がより構造化されていると思います。

答え2

脱出するときは注意が必要です。使用:

"${i//\//_}"

関連情報