저는 리눅스 명령어를 배우고 있어요.
시간 정보를 포함하여 파일 이름을 바꾸면 태그가 자동으로 할당됩니다 :
. 이 :
플래그를 어떻게 변경할 수 있나요 _
?
다음은 파일 이름의 예입니다. 업데이트된 타이밍 정보가 있습니다. 대체하여 :
이름을 지정하는 방법은 무엇입니까 _
?
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 strftime
date
ee_2019-08-11_16-59-55.txt
date
%F
%Y-%m-%d
또는,
cp ee.txt "$(date +"ee_%F_%H-%M-%S.txt")"
( date
명령 형식이 새 파일 이름을 만드는 대부분의 작업을 수행하도록 합니다.)