veryverylongfilename.txt
짧은 파일 시스템으로 전환하고 싶습니다.NAME_MAX.
mv veryverylongfilename.txt /mnt/tiny
하나 줘 봐에나툴론- 유형 오류:
mv: cannot stat '/mnt/tiny/veryverylongfilename.txt': File name too long
필요한 경우 파일 이름을 자르려면 어떤 명령을 사용해야 합니까?
명령이 확장자를 유지할 수 있다면 좋을 것입니다. 또한 확장자 앞의 마지막 몇 문자를 모든 종류의 고유 식별자로 바꿔서 이동할 때 veryverylongfilename1.txt
와 같이 기존 파일을 덮어쓰지 않는 것이 가장 좋습니다 .veryverylongfilename2.txt
답변1
다음 함수(bash에서 테스트됨)는 첫 번째 인수를 두 번째 인수로 이동하려고 시도합니다. 첫 번째 인수는 파일이고 두 번째 인수는 디렉터리일 것으로 예상하고 테스트합니다.
로컬 "namemax" 변수는 파일 시스템의 NAME_MAX
.
moveshort() {
local namemax=8
# simple sanity checks
[ "$#" -eq 2 ] || return 1
local src=$1
[ -e "$src" ] || return 2
local dest=$2
[ -d "$dest" ] || return 3
local extension=${src##*.}
local basename=${src%.*}
# the base name has ($namemax - $extension - 1)
# characters available to it (1 for the period)
local maxbase=$((namemax - ${#extension} - 1))
# shorten the name, if necessary
basename=${basename:0:maxbase}
# echo "Shortened name: ${basename}.${extension}"
# find a new name, if necessary
if [ -e "${dest}/${basename}.${extension}" ]
then
local index=1
local lenindex=${#index}
#local newbase=${basename:0:-lenindex}
local newbase=${basename:0:maxbase - lenindex}
# loop as long as a conflicting filename exists and
# we're not out of space in the filename for the index
while [ -e "${dest}/${newbase}${index}.${extension}" -a "${#index}" -lt "$maxbase" ]
do
index=$((index + 1))
lenindex=${#index}
newbase=${newbase:0:maxbase - lenindex}
done
if [ -e "${dest}/${newbase}${index}.${extension}" ]
then
echo "Failed to find a non-colliding new name for $src in $dest" >&2
return 4
fi
basename=${newbase}${index}
# echo "new name = ${basename}.${extension}"
fi
# perform the move
mv -- "$src" "${dest}/${basename}.${extension}"
}
온전성 검사 후 함수는 확장자와 나머지 기본 파일 이름을 저장한 다음 기본 파일 이름에 사용할 수 있는 문자 수를 결정합니다.
주어진 파일 이름이 이미 너무 길면 추가 문자를 제거합니다.
단축 이름이 대상에 이미 존재하는 경우 1부터 시작하여 기본 파일 이름에 공간이 부족하거나 존재하지 않는 파일이 발견될 때까지 새 기본 파일 이름을 생성하는 루프를 시작합니다. 인덱스가 커지면 새로운 기본 파일 이름이 인덱스에 의해 압축됩니다.
파일 이름에 공간이 부족하면 함수는 오류를 표시하고 그렇지 않으면 실행을 시도합니다 mv
.