이름을 바꿀 각 파일의 텍스트를 사용하여 많은 수의 파일 이름을 바꾸는 스크립트

이름을 바꿀 각 파일의 텍스트를 사용하여 많은 수의 파일 이름을 바꾸는 스크립트

각 파일의 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표현식 뒤에 공백을 추가할 수도 있습니다(파일 이름에 나타날 수 있는 다른 문자와 유사하게 - 기본적으로 스크립트는 문자와 숫자를 제외한 모든 것을 밑줄 내용으로 바꿉니다).\ws///g

관련 정보