我正在尝试将一些带有长文件名的文件复制到旧的Windows XP 32位FAT32系统上,并且我收到文件名太长的错误。如何在目录中递归搜索大于或等于255个字符的文件名,并根据FAT32文件系统截断它们?
答案 0 :(得分:2)
我确信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
选项吗?
答案 1 :(得分: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
我实际上也不知道如何做到这一点,但对first Google result to "unix truncate file name"的一些简单修改足以产生上述解决方案。先试试吧;)
答案 2 :(得分: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
(...)