파일 확장자가 .bak _before_인 백업 파일

파일 확장자가 .bak _before_인 백업 파일

나는 일반적으로 다음과 같이 버전 제어 없이 서버의 구성 파일을 백업합니다.

# cp httpd.conf{,.bak}
# ls
httpd.conf    httpd.conf.bak

그러나 웹 루트에 있는 파일의 경우 .bak파일 확장자를 주의 깊게 추가하여 .php보존하고 Apache가 여전히 PHP 인터프리터를 통해 파일을 보낼 수 있도록 합니다(누군가 그러한 파일이 존재하는지 추측하거나 조사하는 경우). 서버 ):

$ cp index.php index.bak.php
$ ls
index.php    index.bak.php

.bak파일 확장자 앞에 탭 완성 기능과 머슬 메모리를 넣을 수 있는 방법이 있나요 ? Tab{}←,.bak나는 네트워크 루트에 있는 파일에 대해 이 멋진 "미트 매크로"를 사용할 수 없다는 것을 근육 기억으로 배웠습니다 .

감사해요.

답변1

간단할 수도 있다

cp file.{ext,bak.ext}

bash {} 확장자는 모든 조합으로 확장됩니다(기존 파일을 나열하는 [] 확장자와 달리). 따라서 두 개의 파일 이름을 생성합니다.

{ .... , .... } 는 file.ext 및 file.bak.ext를 가져올 수 있도록 두 가지 옵션을 제공합니다.

스크립트에서 다음을 사용합니다.

cp $FILE.{$EXTENTION,bak.$EXTENTION}

FILENAME을 반으로 나누려면 다음을 사용할 수 있습니다.

FILE=${FILENAME%.*}
EXTN=${FILENAME##*.}

${VAR%xxxxx}는 패턴이 일치할 때까지 VAR에서 콘텐츠의 왼쪽을 반환합니다. 위의 경우 패턴은 .*이므로 마지막 .*를 제외한 모든 항목을 얻게 됩니다.

${VAR##xxxxx}는 일치하는 패턴 다음에 VAR의 콘텐츠 오른쪽을 반환합니다. 이중 해싱은 가능한 일치 항목이 여러 개인 경우 가능한 최대 일치 항목을 얻는 것을 의미합니다.

스크립트를 저장하려면 FILE, EXTENTION을 가져온 후 다른 상황이 있는지 확인하세요. 파일 이름에 확장자가 없으면 이런 일이 발생합니다.

스크립트의 하위 섹션은 다음과 같습니다.

ls *html | while read FILENAME
do
    FILE=${FILENAME%.*}
    EXTN=${FILENAME##$FILE}
    cp $FILE{$EXTN,.bak$EXTN}
done

답변2

언제든지 함수를 사용할 수 있습니다.

backup()
  for i do
    case ${i##*/} in
      (?*.?*) cp -iv -- "$i" "${i%.*}.bak.${i##*.}";;
      (*) cp -iv -- "$i" "$i.bak"
    esac
  done

${i##*/}예, 기본 이름 (즉, 맨 오른쪽에 있는 모든 항목이 $i제거됨 ) 은 .$i/bar/filefoo.bar/file

$i그런 다음 확장자가 포함되어 있는지 확인합니다 . 즉 dot, 양쪽에 문자가 있는 문자가 하나 이상 포함되어 있는지 확인합니다( ?*모든 문자이어서0자 이상, 그렇군요하나 이상의 문자). 예를 들어, 이 작업을 수행할 수 없거나 *.*백업이 있을 수 있습니다.~/.bashrc~/.bak.bashrc

위의 구문은 POSIX입니다 -v.말 수가 많은) 옵션 cp은 GNU 확장이며 BSD와 같은 다른 구현에서도 찾을 수 있습니다.

그런 다음 다음과 같이 할 수 있습니다.

backup foo.php bar.html baz<Tab>...

또는:

backup *.php

-i데이터가 손실되거나( 파일을 덮어쓰기 전에 확인 메시지가 표시됩니다. -bGNU 옵션 도 참조하세요 cp) 올바른 이름을 선택하지 않을까 걱정하지 마세요 .

답변3

"bak.php"를 한 번에 추가할 수 있도록 확장자 없이 파일 이름의 복사본을 보관하는 것 외에는 탭을 완성하는 방법이 즉시 생각나지 않습니다. 하지만 내 솔루션은 파일 이름을 입력으로 사용하여 "firstpart.bak.extension"에 복사하는 작은 쉘 스크립트였습니다.

답변4

소스 제어가 없는 여러 UNIX 시스템에서 이 문제가 발생하여 신속하게 작은 변경을 수행해야 했습니다. 이런 상황에서는 빠른 복구를 위해 스크립트를 사용하여 파일을 잘라서 타임스탬프가 있는 복사본을 만듭니다. ls는 파일을 표시하고 그 뒤에 버전 날짜를 파일 이름별로 정렬하여 표시합니다.

if [ "$1" = "" ]; then
   echo "File name required. Aborting."
   exit 1
fi

CDATE=`date +%Y-%m-%d-%H-%M`
cp "$1" "$1-$CDATE"
echo File backed up to: $1-$CDATE

용법:

VERS.sh httpd.conf

산출:

File backed up to: httpd.conf-2016-07-14-10-27

관련 정보