Filenames

如何將文件名中的“/”替換為“_”

  • May 17, 2017

我正在創建每個掛載點的備份 tar 文件:

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

我正在嘗試創建像

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 

這看起來很奇怪:

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

你想mvecho這裡築巢嗎?命令替換的$(...)語法將使嵌套更容易:

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

但是我仍然看不到mv這裡有任何用處,更不用說echowhich 只會重複mv輸出什麼,如果它有效,它不應該輸出任何東西。

我們可以直接取消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-20172017-05-17因為後者使排序更容易。刪除前導/是多餘的,因為無論如何它都會變成_我們想要的,但我發現這種方式更有條理。

引用自:https://unix.stackexchange.com/questions/365619