파일 이름을 20자, 파일 확장자 .txt로 유지하는 방법

파일 이름을 20자, 파일 확장자 .txt로 유지하는 방법

다음과 같은 파일이 많이 있습니다.

hhsLog.8020.20200330}1585594173}0}coll_DefaultCollectorGroup_1_158594166_132642}1036942}0}0

.txt처음 20자를 유지하고 확장자를 추가하고 싶습니다 . 결국에는 다음과 같은 파일이 있어야 합니다.

hhsLog.8020.20200330.txt

저는 Fedora와 Solaris를 사용하고 있습니다.

답변1

쉘 루프를 사용하면 이 작업을 쉽게 수행할 수 있습니다 bash.

cd /path/to/files/;
for file in *; do
    echo mv -i -- "$file" "${file:0:20}.txt"
done

원하는 기능에 만족하면 에코를 제거하여 실제로 파일 이름을 바꿉니다.

 cd /path/to/files/;
 for file in *; do
    mv -i -- "$file" "${file:0:20}.txt"
done

덮어쓰기 전에 새 이름 중 하나가 이미 존재하는지 -i묻습니다 .mv

답변2

Fedora와 Solaris는 bash 쉘을 지원합니다:

그리고'을 위한'경우에 따라 경로와 파일 이름을 별도로 처리하는 대신 루프를 실행하면 언급된 경로의 처음 20자를 처리하지만 실제 파일 이름은 처리하지 않습니다.

따라서 하위 디렉터리로 이동하지 않고도 원하는 작업을 수행할 수 있습니다(하위 디렉터리를 처리하려면 "-maxlength 0" 옵션을 제거하세요.

find /path/of/the/files/* -maxdepth 0 -type f| xargs -I[] bash -c 'val="[]";file=${val##*/};newfile=${file:0:20};mv $val ${val%/*}/$newfile.txt'  

이것-나xargs의 옵션은 발견된 모든 파일 이름(경로 포함)을 "[]", 우리는 각각에서 bash 명령을 실행하고 있습니다.[]->파일 이름그걸 어디에 저장해?$val변수를 선택하고 경로와 파일 이름을 추출하고, "mv fullpath-with-filename fullpath-withoutfilename/first20charcters-of-filename"과 같이 파일 이름의 처음 20자를 개별적으로 가져와 이동합니다.

답변3

hhslog.*현재 디렉터리의 모든 관련 파일 이름이 일치한다고 가정합니다. 그런 다음 Perl rename유틸리티를 사용하십시오.

rename  's/(.{20}).*/$1.txt/' hhsLog.*

이는 s/(.{20}).*/$1.txt/각 파일 이름에 Perl 대체를 적용합니다. 이렇게 하면 이름이 20자로 잘린 다음 .txt파일 이름 접미사도 추가됩니다.

이름을 자르려면 다음 }을 사용하세요.

rename  's/([^}]+).*/$1.txt/' hhsLog.*

또는

rename -n 's/(.+?)}.*/$1.txt/' hhsLog.*

단어 문자나 점이 아닌 첫 번째 문자에서 이름을 자르려면 다음을 사용하십시오.

rename 's/([\w.]+).*/$1.txt/' hhsLog.*

답변4

이것은 작동합니다:

for file in *
 do
 file2=$(echo ${file} | cut -c 1-20)
 mv ${file} ${file2}.txt
 done

관련 정보