나는 수백 개의 디렉토리를 가지고 있으며, 일부는 다른 디렉토리 내에 중첩되어 있으며 그 안에 수만 개의 파일이 있습니다. 이러한 파일에는 날짜/시간 스탬프를 제거해야 합니다.
예시 파일 이름은 입니다 Letter to Client 27May2016~20160531-162719.pdf
. 원래 상태로 되돌리고 싶습니다.Letter to Client 27May2016.pdf
또 다른 예시 파일 이름은 입니다 ABCDEF~20160531-162719
. 로 되돌리고 싶습니다 ABCDEF
. 위 예시와 달리 이 파일에는 확장자가 없습니다.
영향을 받는 폴더의 루트에서 실행하여 파일 이름을 재귀적으로 찾아 수정하는 명령이 필요합니다.
(저는 Syncthing을 사용하여 파일을 동기화하고 삭제된 파일을 .stversions
디렉터리에서 원래 위치로 복사하여 복구했지만 Syncthing에 해당 날짜/시간 스탬프가 추가된 것을 발견했습니다...)
답변1
Perl rename
도구에 대해 알아보세요:
$ rename -n -v 's/~[^.]+//' *~*
rename(ABCDEF~20160531-162719, ABCDEF)
rename(Letter to Client 27May2016~20160531-162719.pdf, Letter to Client 27May2016.pdf)
(온라인 매뉴얼 페이지, 반품이 질문을 봤어요)
이 정규식은 물결표(즉, 점이 아닌 하나 이상의 문자)와 일치하고 빈 문자열과 일치하는 모든 문자를 대체한다고 말합니다. -n
실제로 교체하려면 삭제하세요 . ~[-0-9]+
숫자와 대시만 바꾸 도록 패턴을 변경할 수 있습니다 .
죄송합니다. "재귀적으로"라고 말씀하셨으니 다음을 사용해 보겠습니다 find
.
$ find -type f -name "*~*" -execdir rename -n -v 's/~[-0-9]+//' {} +
rename(./ABCDEF~20160531-162719, ./ABCDEF)
rename(./Letter to Client 27May2016~20160531-162719.pdf, ./Letter to Client 27May2016.pdf)
아니면 그냥 Bash나 ksh를 사용하세요. 하지만 숫자 뒤에 오는 디렉토리는 ~
이를 깨뜨립니다.
$ shopt -s extglob # not needed in ksh (as far as I can tell)
$ shopt -s globstar # 'set -o globstar' in ksh
$ for f in **/*~* ; do
g=${f//~+([-0-9])/};
echo mv -- "$f" "$g"
done
mv -- ABCDEF~20160531-162719 ABCDEF
mv -- Letter to Client 27May2016~20160531-162719.pdf Letter to Client 27May2016.pdf
실제로 이름을 바꾸 려면 다시 삭제하세요 echo
.
답변2
배쉬에서:
shopt -s globstar
for file in **/*~[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]*
do
echo mv -- "$file" "${file/~[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]/}"
done
이는 날짜 패턴(뒤에 물결표 표시)과 일치하는 모든 파일 이름을 (반복적으로) 찾은 다음 이름을 mv
바꾸는 예제 명령을 반환합니다. mv 명령의 대상은 물결표 날짜 문자열 리터럴을 아무것도 대체하지 않는 bash 인수 확장의 결과입니다.
답변3
암호:
echo "ABCDEF~20160531-162719" | sed "s/~.*//g"
echo "Letter to Client 27May2016~20160531-162719.pdf" |sed "s/~.*[^.pdf]//g"
위 명령은 위의 결과를 얻습니다.