web-dev-qa-db-ja.com

Windowsと互換性のないすべてのパスを見つける方法は?

ほとんどのLinuxファイルシステムでは、NUL(\0)はパス(および/はパス区切り文字として予約されています)。 Windowsには、有効なパスに関する一連の複雑なルールがあります 。パスを自動的に修正するのではなく(危険で、ファイルが別のファイルを上書きする可能性があります)、Windowsと互換性のないディレクトリ内のすべてのパスを見つけるにはどうすればよいですか?

元々の問題は、 Google Drive フォルダーが ext2fs を使用してマウントされたドライブにあることでしたが、公式のGdriveクライアントから数千のファイルを同期できないと言われました。エラーメッセージは見つかりませんでした。ファイルを表示するように要求すると、無期限にハングします。クライアントまたはOSを再起動しても役に立ちませんでしたが、私には予感がありました Windowsと互換性のないパスを修正する Gdriveのスティックが外れるでしょう。うまくいったようです...

6
l0b0

予約された名前/文字のパス:

LC_ALL=C find . -name '*[[:cntrl:]<>:"\\|?*]*' \
             -o -iname 'CON' \
             -o -iname 'PRN' \
             -o -iname 'AUX' \
             -o -iname 'NUL' \
             -o -iname 'COM[1-9]' \
             -o -iname 'LPT[1-9]' \
             -o -name '* ' \
             -o -name '?*.'

テスト:

$ cd -- "$(mktemp --directory)"
$ touch foo \\ LPT9 'space ' 'dot.'
$ LC_ALL=C find . -name '*[[:cntrl:]<>:"\\|?*]*' -o -iname 'CON' -o -iname 'PRN' -o -iname 'AUX' -o -iname 'NUL' -o -iname 'COM[1-9]' -o -iname 'LPT[1-9]' -o -name '* ' -o -name '?*.'
./dot.
./space 
./LPT9
./\

大文字と小文字を区別しない場合に同一のパス(改行を含むパスでは機能しません):

find . | sort | LC_ALL=C tr '[:upper:]' '[:lower:]' | uniq -c | grep -v '^      1 ' | cut -c '9-'

テスト:

$ cd -- "$(mktemp --directory)"
$ touch foo bar BAR
$ find . | sort | LC_ALL=C tr '[:upper:]' '[:lower:]' | LC_ALL=C uniq -c | grep -v '^      1 ' | cut -c '9-'
./bar

MAX_PATH(260文字)より長いパス:

find "$PWD" | while IFS= read -r path
do
    if [ "${#path}" -gt 260 ]
    then
        printf '%s\n' "$path"
    fi
done

テスト:

$ cd -- "$(mktemp --directory)"
$ touch foo 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
$ find "$PWD" | while IFS= read -r path
> do
>     if [ "${#path}" -gt 260 ]
>     then
>         printf '%s\n' "$path"
>     fi
> done
/tmp/tmp.HEANyAI8Hy/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
3
l0b0