Linux의 다중 로케일 환경 및 파일 저장은 확실히 파일 이름에 이러한 모든 국제(아시아) 문자를 허용합니다. 그러나 국제 문자는 모두 다른 시스템에서??? 등으로 처리되고 더 이상 해당 시스템에 대한 고유한 파일 이름이 아니기 때문에 다른 시스템과 동기화하는 데 문제가 발생합니다(범인은 우리가 동기화하려는 MS Onedrive/Sharepoint입니다). ) - 이름은 다르지만(아시아 문자) 문자 수가 동일한 동일한 디렉터리에 있는 두 개의 파일입니다. 불행하게도 파일 이름이 동일한 것으로 간주되어 복사 오류가 발생합니다. 파일 이름을 바꾸는 것 외에는 해결 방법이 없는 것 같습니다.
파일 이름에 파일 자체의 ASCII 날짜/시간을 추가하고 싶습니다. 그렇게 하면 됩니다.
이 명령은 나에게 "문제가 있는" 모든 파일을 찾는 데 효과적입니다. 말하자면 /path/to/files/ 및 모든 하위 폴더에 있는 파일 및 폴더 이름에서 ASCII가 아닌 문자를 모두 찾습니다.
find /path/to/files/ | grep -P "[\x80-\xFF]"
이 파일로 해야 할 일은 파일 자체의 ASCII 날짜/시간에 기본 파일 이름을 추가하는 것입니다(파일 확장자는 그대로 유지).
출생, 수정, 통계에 따른 날짜 변경 등 거의 모든 날짜 시간이 가능합니다. 반환된 메시지는 다음과 같이 작동합니다.
stat -c '%y' filename
date -r filename
첫 번째 find 명령으로 나열된 파일의 기본 파일 이름에 파일의 이러한 날짜/시간을 자동으로 추가하는 방법을 모르겠습니다.
답변1
그리고 zsh
:
#! /bin/zsh -
zmodload zsh/stat
zmodload zsh/files # for its builtin mv to speed things up.
set +o multibyte -o extendedglob
# comment-out the line below once you're satisfied it does what you want.
mv() { printf 'Would rename %s to %s\n' ${(q+)2} ${(q+)3}; }
ts_format='-%FT%T.%3.%z'
# we build a $ts_pattern to be able to identify files that already have
# had a timestamp appended, by obtaining a sample timestamp for the /
# directory, and replacing all digits in it with [0-9]. That assumes you
# don't use wildcard characters nor day/month/timezone names, am/pm in your
# $ts_format.
stat -F $ts_format -A ts_sample +mtime /
ts_pattern=${ts_sample//[0-9]/[0-9]}
for file in **/(*[$'\x80'-$'\xff']*~*$~ts_pattern(.*|))(DNod); do
stat -LF $ts_format -A ts +mtime -- $file || continue
case $file:t in
(?*.*) mv -- $file $file:r$ts.$file:e;; # insert ts before extension
(*) mv -- $file $file$ts;;
esac
done
일부 Microsoft 운영 체제에는 문자가 포함된 파일 이름에 문제가 있다는 이야기를 들었습니다. :
따라서 타임스탬프 형식(여기서는 밀리초 정밀도의 국제 표준 형식)을 조정해야 할 수도 있습니다 2020-08-23T08:14:38.318+0100
. 이는 strftime()
특정 %<precision>.
1초 미만 부분 zsh
( 에는 해당 부분이 없음 )을 제외하고 표준 형식 명령입니다 strftime()
.