시간정보에 ":"가 포함된 파일명을 변경하는 방법

시간정보에 ":"가 포함된 파일명을 변경하는 방법

저는 리눅스 명령어를 배우고 있어요.

시간 정보를 포함하여 파일 이름을 바꾸면 태그가 자동으로 할당됩니다 :. 이 :플래그를 어떻게 변경할 수 있나요 _?

다음은 파일 이름의 예입니다. 업데이트된 타이밍 정보가 있습니다. 대체하여 :이름을 지정하는 방법은 무엇입니까 _?

ee_Sun_Aug_11_22:20:27_GMT-8_2019.txt

또한 다음은 왜 작동하지 않습니까?

$ cp /var/log/ee.txt ee_`date`.txt
cp: target `2019.txt' is not a directory

답변1

:ksh93, zsh, bash, mksh 셸(또는 최신 버전의 busybox sh)을 사용하여 현재 디렉터리에서 이름이 로 끝나는 문자가 하나 이상 있는 모든 파일을 반복 .txt하고 :문자를 로 변경하려면 다음을 _사용할 수 있습니다.

for name in ./*:*.txt; do
    newname=${name//:/_}
    mv -i "$name" "$newname"
done

아니면 더 짧게,

for name in ./*:*.txt; do
    mv -i "$name" "${name//:/_}"
done

매개변수 대체는 값의 모든 위치 를 ${name//:/_}변경합니다 (위 쉘은 ksh93 연산자도 지원합니다).:_$name

파일 이름이 변경 되지만 mv -i새 이름이 이미 사용되었는지 확인하는 메시지가 표시됩니다.

예시로 표시된 파일 이름은 ee_Sun_Aug_11_22_20_27_GMT-8_2019.txt.


주문

cp /var/log/ee.txt ee_`date`.txt

date출력이 공백이 포함된 문자열이기 때문에 작동하지 않습니다 . 이 공간은 cp당신이 복사하고 싶다고 생각 하게 만들 것입니다일부파일을 디렉토리에 넣습니다. 따라서 "디렉토리가 아님" 오류가 발생합니다.

다음이 더 잘 작동합니다.

cp /var/log/ee.txt "ee_$(date).txt"

백틱을 로 변경했기 때문 $(...)이 아니라 새 이름을 두 번 인용했기 때문에 더 잘 작동합니다.

그러면 파일 ee_Sun Aug 11 16:57:37 CEST 2019.txt(또는 유사한 파일)이 생성됩니다.

더 깔끔한 파일 이름을 얻으려면 date출력 형식을 더 정확하게 지정하는 것이 좋습니다.

cp ee.txt "ee_$(date +"%F_%H-%M-%S").txt"

형식 문자열은 시스템 설명서( ) 또는 명령 설명서에 %F_%H-%M-%S설명되어 있으며 해당 지시어를 지원하지 않으면 로 바꿀 수 있습니다.strftime(3)man 3 strftimedateee_2019-08-11_16-59-55.txtdate%F%Y-%m-%d

또는,

cp ee.txt "$(date +"ee_%F_%H-%M-%S.txt")"

( date명령 형식이 새 파일 이름을 만드는 대부분의 작업을 수행하도록 합니다.)

관련 정보