Linux の複数のロケール環境とファイルの保存は、確かにファイル名にこれらすべての国際 (アジア) 文字を受け入れます。しかし、国際文字はすべて別のシステムで?などとして処理され、もはやそのシステムの一意のファイル名ではないため、他のシステムと同期する際に問題が発生します(犯人は私たちが同期したいMS Onedrive / Sharepointです)。 ) - 名前は異なりますが(アジア文字)、同じ文字数を持つ同じディレクトリにある2つのファイルです。残念ながら、ファイル名は同じと見なされ、コピーエラーが発生します。ファイル名を変更する以外に解決策がないようです。
ファイル名にファイル自体の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()
。