파일 이름에 IP 주소를 유지하면서 여러 파일의 일부 이름을 바꿔야 합니다.
예를 들어,
Abc_192.168.1.164_001.txt
Abc_10.11.76.112_001.txt
Abc_54.78.1.1_002.txt
IP 주소뿐만 아니라 "Abc_" 부분도 유지해야 합니다. 그 이후의 모든 내용은 날짜 및 시간 스탬프로 대체됩니다. 현재 날짜와 타임스탬프를 "_yymmdd-yymmdd-hhmmss"로 추가하고 확장자를 ".csv"로 변경하겠습니다. 이것은 Linux에서 실행됩니다.
답변1
다음은 귀하가 요청한 대로 파일 이름을 (신중하게) 바꾸는 간단한 쉘 루프입니다.
d=$(date +%y%m%d-%y%m%d-%H%M%S)
for f in Abc_*.*.*.*_*.txt
do
new=${f%_*}_${d}.csv
[ ! -f "$new" ] && mv "$f" "$new"
done
먼저 작성한 형식으로 명명된 변수에 타임스탬프를 캡처합니다 d
. 그런 다음 간단한 glob 형식을 반복하여 이름이 "Abc_"로 시작하는 모든 파일을 선택하고 마침표 세 개 사이의 모든 파일, 밑줄 및 기타 항목, 마지막으로 ".txt" 끝으로 끝나는 파일을 선택합니다.
마지막 밑줄(및 포함) 뒤의 모든 항목을 제거한 다음 타임스탬프( ${d}
)와 새 ".csv" 확장자를 추가하여 새 파일 이름을 계산합니다.
새 파일 이름이 다음과 같은 경우아니요존재하는 경우 파일 이름이 변경됩니다. [ ! -f "$new" ] &&
기존 파일을 삭제하지 않으려면 이 섹션을 삭제하세요.
실제로 실행하기 전에 수행할 작업을 확인하려면 echo
before를 추가하세요.mv
내가 그것을 실행하면 다음이 표시됩니다.
$ touch Abc_10.11.76.112_001.txt Abc_192.168.1.164_001.txt Abc_54.78.1.1_002.txt
$ d=$(date +%y%m%d-%y%m%d-%H%M%S)
$ for f in Abc_*.*.*.*_*.txt; do new=${f%_*}_${d}.csv; [ ! -f "$new" ] && mv "$f" "$new"; done
$ ls -1
Abc_10.11.76.112_160913-160913-140649.csv
Abc_192.168.1.164_160913-160913-140649.csv
Abc_54.78.1.1_160913-160913-140649.csv
답변2
통과되면날짜 및 시간 스탬프, 파일 수정 시간을 의미하는 경우 zsh
다음과 같이 할 수 있습니다.
zmodload zsh/stat
autoload zmv
zmv -n '(*_*_)*(.txt)' '$1$(zstat -F %FT%T%z +mtime -- $f)$2'
( -n
실제로 이름을 바꾸려면 제거하세요)
심볼릭 링크된 파일 의 경우 .txt
타임스탬프는 심볼릭 링크 자체의 수정 시간이 아니라 심볼릭 링크 대상의 수정 시간을 기반으로 합니다. 심볼릭 링크 자체의 수정 시간을 사용 -L
하는 옵션을 추가합니다 .zstat
%FT%T%z
명시적인 로컬 타임스탬프를 제공하세요 2016-09-13T17:32:17+0100
. 예: 필요에 맞게 표준 형식을 사용할 수 있습니다 strftime()
( 와 동일 date +<format>
). 그러나 1초 미만의 정밀도는 지원 zsh
되지 않습니다 zstat
(수정 시간을 1초 미만의 정밀도로 저장하는 파일 시스템의 경우).
GNU 시스템을 사용하는 경우 date -r
대신 GNU를 사용하여 zstat
다음 나노초를 얻을 수 있습니다.
$ zmv -n '(*_*_)*(.txt)' '$1$(date -r $f +%FT%T.%N%z)$2'
mv -- Abc_192.168.1.164_001.txt Abc_192.168.1.164_2016-09-13T17:32:17.368805094+0100.txt
와 마찬가지로 zstat
수정 시간이 필요합니다.표적심볼릭 링크 자체가 아니라 심볼릭 링크의 것입니다. date
심볼릭 링크와 함께 mtime을 사용할 수 있는 옵션은 없지만 find
대신 GNU를 사용할 수 있습니다.