다음과 같은 파일이 많이 있습니다.
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