Bash 截断超过255个字符的文件名

Bash 截断超过255个字符的文件名,bash,sed,fat32,Bash,Sed,Fat32,我正试图将一些文件名较长的文件复制到旧的Windows XP 32位FAT32系统上,但由于文件名过长而出现错误。如何在目录中递归搜索大于或等于255个字符的文件名,并根据FAT32文件系统的情况截断它们?给您: find /path/to/base/dir -type f | \ while read filename do file="${filename%%.*}" ext="${filename##*.}" if [[ "${#file}" -gt 251 ]];

我正试图将一些文件名较长的文件复制到旧的Windows XP 32位FAT32系统上,但由于文件名过长而出现错误。如何在目录中递归搜索大于或等于255个字符的文件名,并根据FAT32文件系统的情况截断它们?

给您:

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

实际上我也不知道如何做到这一点,但对的一些简单修改就足以产生上述解决方案。你自己先试试;)

您可以在终端中使用
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
(...)

我确信
find
可以完成整个工作,我无法完成最后一步,因此求助于使用一些
bash
foo:

#/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
选项进行此操作吗