파일 이름 단축을 위한 Linux 스크립트 또는 프로그램

파일 이름 단축을 위한 Linux 스크립트 또는 프로그램

아직 Linux 버전을 찾지 못했습니다.이름 변경자, Windows에서 읽을 수 있도록 1000개의 파일 이름을 바꿔야 합니다.

이 작업을 수행할 수 있는 Linux 프로그램을 아는 사람이 있습니까?

그렇지 않은 경우 폴더의 모든 파일 이름을 처음 16자로 바꾸므로 스크립트가 작동할 수 있습니다. 스크립트 경로를 계속할 가치가 있다고 생각하지만 어디서부터 시작해야 할지 모르겠습니다.

답변1

Debian, Ubuntu 및 그 파생 제품에서 man rename명령 프롬프트에 입력하면 이름 바꾸기 유틸리티에 대한 매뉴얼 페이지가 표시되며, 이름 바꾸기에 Perl과 같은 임의의 정규식 명령을 사용할 수 있습니다.

예를 들어, 현재 디렉터리의 모든 파일을 길이 5로 줄입니다(잘림).

rename 's/^(.{5}).*/$1/' *

처음 5개 문자를 캡처한 다음 이를 대체하여 사용하고 나머지 문자를 제거하는 방식으로 작동합니다.

또 다른 예는 파일 이름(확장자 없음)을 5자로 줄이는 것입니다.구하다확장자 이름:

rename 's/^(.{5}).*(\..*)$/$1$2/' *

그것은 포착한다그룹, 첫 번째는 처음 5자이고 두 번째는 확장자입니다. 이것은 myCarefullyCraftedDocument.pdf될 것입니다 myCar.pdf.

경고하다:이것을 사용주의 깊은,바람직하게는복사디렉터리를 선택하거나 먼저 백업을 만드세요. 당신은 경고를 받았습니다! ! 적어도 rename -n먼저 사용하면 실제로 실행하지 않고도 무엇을 할 것인지 알려줄 것입니다.

답변2

충돌하는 파일을 다른 디렉터리로 이동할 수 있습니다.

for i in *
do
    j=${i:0:16}

    if [ -e "$j" ]
    then
        mv "$i" /path/to/rename/later
    else
        mv "$i" "$j"
    fi
done

답변3

몇 줄의 bash에서 파일 이름을 줄이고 Windows가 좋아하지 않는 문자를 제거하는 스크립트를 작성할 수 있습니다. 경고, 테스트되지 않은 코드가 내 브라우저에 직접 입력되었습니다.

shopt -s dotglob extglob
for x in *; do
  y=${x//+([!-!#$%&'().0-9@A-Z^_`a-z{}~])/_}  # change all problematic characters to _
  if [[ $y = .* ]]; then y=_${y#.}; fi        # change dot files to begin with _
  y=${y:0:16}                                 # truncate names
  y=${y,,}                                    # convert to lowercase
  if [[ -e $y || $y =~ ^(aux|clock\$|com[0-9]|con|lpt[0-9]|nul|prn)(\.*)?$ ]]; then
    # The file exists or is a DOS/Windows reserved name.
    # Change foo.bar to foo~1.bar, foo~2.bar, ... (I ignore the length restriction here)
    i=1
    if [[ $y =~ \. ]]; then
      prefix=${y%%.*}; suffix=.${y#*.}
    else
      prefix=$y; suffix=
    fi
    y=${prefix}~$i$suffix
    while [[ -e $y ]]; do
      ((++i))
      y=${prefix}~$i$suffix
    done
  fi
  mv -- "$x" "$y"
done

하위 디렉터리로 재귀적으로 이동해야 하는 경우 에서 셸 스크립트를 호출하세요 find -depth -exec …. 또는 zsh에서 bash 대신 zsh를 사용하면 **/*(od)더 깊이 중첩된 파일부터 시작하여 현재 디렉터리의 모든 파일로 재귀적으로 확장됩니다.

답변4

일부 시스템에는 해당 명령이 없으므로 renamepaxdiablo의 답변에 대한 대안으로 사용 방법은 다음과 같습니다 mv.

for f in *.pdf; do 
    tmp=`echo $f | sed -r 's//^(.{5}).*(\..*)$/$1$2/'`
    mv -b ./"$f" ./"$tmp"
done

플래그를 이동하면 -b삭제되거나 덮어쓸 파일의 백업이 생성됩니다. for 루프에서 glob 패턴을 변경하면 실행되는 파일을 조정할 수 있으며 *이를 개별적으로 사용하여 모든 파일에서 실행할 수 있습니다.

관련 정보