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

我实际上也不知道如何做到这一点,但是对“unix truncate file name”的第一个 Google 结果进行一些简单的修改就足以产生上述解决方案。先自己试试吧;)

于 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 回答