하나 이상의 tar.gz 파일이 포함된 폴더가 있습니다. 스크립트가 실행될 때 각 파일 앞에 현재 날짜를 추가하고 싶습니다.
예를 들어:
두 개의 파일 이름(이 파일은 매일 생성되지만 이름은 동일하게 유지됨):
file1.tar.gz
file2.tar.gz
첫 번째 날(2011-10-07)에 이 두 파일의 이름은 다음과 같이 변경됩니다.
2011-10-07_file1.tar.gz
2011-10-07_file2.tar.gz
다음날(2011-10-08)은 다음과 같이 변경되었습니다.
2011-10-08_file1.tar.gz
2011-10-08_file2.tar.gz
마지막으로 폴더에는 다음 파일이 포함되어 있습니다.
2011-10-07_file1.tar.gz
2011-10-07_file2.tar.gz
2011-10-08_file1.tar.gz
2011-10-08_file2.tar.gz
하나의 와이어로 이를 달성하는 방법은 무엇입니까? "이름 바꾸기" 명령을 사용해 보았지만 파일 앞이 아닌 파일 뒤에만 날짜를 추가할 수 있습니다.
내 코드
cdate=`date +"%Y-%m-%d"`; rename .gz .gz.$cdate *.gz
답변1
분명히 핵심은 이미 날짜 접두사가 있는 파일의 이름을 바꾸지 않는 것입니다.
cdate=$(date +"%Y-%m-%d")
shopt -s extglob
for file in !([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]*.gz); do
mv "$file" "${cdate}_$file"
done
답변2
file1.2011-10-07.2011-10-08.tar.gz
귀하의 예제 코드는 귀하가 원하는 것과 유사한 결과를 제공할 수 있습니다 .
또한 rename
이는 표준 명령이 아니므로 용도에 따라 다릅니다.
고정된 이름을 가진 고정된 수의 파일만 있다고 말했으므로 아마도 다음과 같은 간단한 스크립트를 사용할 수 있습니다.
cdate=$(date +%Y-%m-%d)
for file in file1.tar.gz file2.tar.gz; do
mv "$file" "$cdate"_"$file"
done
답변3
파일 이름에 밑줄이 포함되지 않는다고 가정하면 간단한 bash 4+ 솔루션을 사용하는 것입니다.외부 전역 변수:
shopt -s extglob
today=$(date +%F)
for f in ./!(*_*).tar.gz; do mv "$f" "$today"_"$f"; done
더욱 강력한 버전:
shopt -s extglob
today=$(date +%F)
for f in ./!(????-??-??_*).tar.gz; do mv "$f" "$today"_"$f"; done
답변4
bashism(루프 및/또는 extglob 모드)을 사용하지 않고 검색, 잘라내기, grep 및 xargs만 사용하면 이 작업을 수행할 수 있습니다.
find . -maxdepth 1 -type f | \
cut -c3- | \
grep -v '^\.' | \
grep -v '^[0-9][0-9][0-9][0-9]\-[0-9][0-9]-[0-9][0-9]_' | \
xargs -n 1 -I {} echo mv "{}" "`date +"%Y-%m-%d"`_{}"
echo
단순히 인쇄하는 대신 변경 사항을 적용하려면 mv 명령을 제거하세요 .