長いファイル名を持ついくつかのファイルを古い Windows XP 32 ビット FAT32 システムにコピーしようとしていますが、ファイル名が長すぎるというエラーが発生します。ディレクトリ内で 255 文字以上のファイル名を再帰的に検索し、FAT32 ファイルシステムに合わせて切り詰めるにはどうすればよいですか?
2350 次
3 に答える
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
誰でもオプションを使用できますか?
于 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 に答える