1

長いファイル名を持ついくつかのファイルを古い Windows XP 32 ビット FAT32 システムにコピーしようとしていますが、ファイル名が長すぎるというエラーが発生します。ディレクトリ内で 255 文字以上のファイル名を再帰的に検索し、FAT32 ファイルシステムに合わせて切り詰めるにはどうすればよいですか?

4

3 に答える 3

2

私はfindすべての仕事を行うことができると確信しています.最後のステップを完全に得ることができなかったので、いくつかのbashfooを使用することに頼りました:

#/bin/bash

find . -maxdepth 1 -type f -regextype posix-extended -regex ".{255,}" |
while read filename
do 
    mv -n "$filename" "${filename:0:50}"
done

を使用findして、ファイル名が 255 文字以上のすべてのファイルを取得します。

find . -maxdepth 1 -type f -regextype posix-extended -regex ".{255,}"

これらのファイル名を 50 文字に切り詰め-n、既存のファイルを上書きしないでください。

mv -n "$filename" "${filename:0:50}"

注: これは-exec誰でもオプションを使用できますか?

于 2012-12-09T18:44:05.103 に答える
0

どうぞ:

find /path/to/base/dir -type f | \
while read filename
do
    file="${filename%%.*}"
    ext="${filename##*.}"
    if [[ "${#file}" -gt 251 ]]; then
         truncated=$(expr $file 1 251)
         mv "${filename}" "${truncated}"."${ext}"
    fi     
done

私は実際にこれを行う方法も知りませんでしたが、最初のGoogleの結果を「unix truncate file name」に変更するだけで、上記の解決策を得ることができました。最初に自分で試してみてください;)

于 2012-12-09T17:38:32.303 に答える
0

perlターミナルでそれを行うことができます:

cd /d \path\to\dir
find . -type f |
    perl -F'[/\\]' -lane '
        $f = $F[-1];
        ($ext) = $f =~ /(\.[^.]+)$/;
        delete $F[-1];
        $path = join "/", @F;

        if (length($f) > 255) {
            $c++;
            rename "$path/$f", "$path/truncated_$c$ext"
        }
    '

名前が変更されたファイルは次のようになります。

truncated_1.ext
truncated_2.ext
(...)
于 2012-12-09T18:17:32.807 に答える