파일 이름의 "/"를 "_"로 바꾸는 방법

파일 이름의 "/"를 "_"로 바꾸는 방법

각 마운트 지점의 백업 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//\//_}"

관련 정보