NAME_MAX가 더 짧은 파일 시스템으로 파일을 이동할 때 필요한 경우 잘립니다.

NAME_MAX가 더 짧은 파일 시스템으로 파일을 이동할 때 필요한 경우 잘립니다.

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.

관련 정보