각 파일의 3번째 줄에 있는 텍스트가 새 파일 이름이 되도록 많은 수의 파일 이름을 바꾸는 솔루션을 고안하려고 합니다. 이 파일들은 모두 동일한 구조를 가지고 있습니다.
이는 HTML 파일이며, 특히 각 파일의 3번째 줄은 다음과 같습니다.
<TITLE>DATA POPULATION 'CODE on group 1234 by THING'</TITLE>
작은따옴표 사이의 모든 내용을 가져오고 해당 텍스트를 사용하여 해당 텍스트를 파일 이름으로 바꾸고 싶습니다.
한꺼번에 이름을 바꾸는 것이 유용할 수 있습니다.
답변1
for src in *.html; do
{ read -r x && read -r x && IFS="'" read -r x dst x; } < "$src" &&
mv -i -- "$src" "$dst.html"
done
( -i
이것은인터렉티브두 파일이 동일한 대상 이름으로 끝나는 경우 사용자에게 파일 손실을 방지할 수 있는 기회를 제공합니다.
답변2
$ awk -v FS="'" -v OFS="\t" 'FNR==3 && NF>2 {print FILENAME, $2; nextfile}' *.txt |parallel --colsep "\t" 'mv {1} {2}'
awk
해당 위치의 모든 파일을 반복합니다. '
필드 구분자로 정의하겠습니다 . 세 번째 줄에 도달하고 2개 이상의 필드가 있을 때마다(두 개의 필드가 있는 경우 그래야 함) '
탭(처음 두 필드 사이의 필드) 부분으로 구분된 파일 이름과 두 번째 필드를 인쇄합니다. '
그런 다음 다음 파일로 이동합니다.
결과는 으로 파이프됩니다 parallel
. 및 를 결과 열에 제공된 값으로 대체하여 명령이 실행됩니다 parallel
.mv
{1}
{2}
awk
몇 가지 참고사항:
nextfile
모든awk
버전을 사용할 수 있는 것은 아닙니다.파일 이름에 공백을 사용하는 것은 결코 좋은 생각이 아닙니다. 다음과 같이 명령을 변경 하는 경우
awk
밑줄로 바꿀 수 있습니다.awk -v FS="'" -v OFS="\t" 'FNR==3 && NF>2 { gsub(" ", "_", $2); print FILENAME, $2; nextfile}' *.txt
- 새 파일 이름을 다른 폴더로 이동하거나 복사해야 합니다.
awk
런타임 시 동일한 폴더에 새 파일이 나타나면 어떻게 반응할지 잘 모르겠습니다 .
답변3
for j in ./*.txt
do
i=$( sed -n '3p' "$j" | cut -d "'" -f2)
mv "$j" "$i"
done
현재 디렉터리의 모든 파일을 검색하여 해당 파일을 새 디렉터리로 이동합니다.
답변4
느리고 깨지기 쉬운 서브쉘을 함께 사용하는 대신 Perl에서 다음과 같은 작업을 수행합니다.
perl -e 'while(<>){
sub no_rename { print "rename @_\n" }
next unless $. == 3;
if(my ($f) = /DATA POPULATION +'\''(.*?)'\''/){
$f =~ s/[^\w]/_/g;
no_rename $ARGV, $f or warn "rename $ARGV, $f: $!\n";
}
close ARGV
}' files ...
표시하는 것이 아니라 실제로 실행하도록 no_rename
변경 해야 합니다 .rename
추악해서 죄송합니다 '\''
. 한 줄 대신 스크립트 파일에 넣으면 간단합니다.
/DATA POPULATION +'(.*?)'/
공백이 포함된 파일 이름을 만들고 싶다면 \s
표현식 뒤에 공백을 추가할 수도 있습니다(파일 이름에 나타날 수 있는 다른 문자와 유사하게 - 기본적으로 스크립트는 문자와 숫자를 제외한 모든 것을 밑줄 내용으로 바꿉니다).\w
s///g