파일 이름의 하위 문자열을 다듬습니다. 각 하위 문자열은 주어진 길이에 패턴과 일치합니다.

파일 이름의 하위 문자열을 다듬습니다. 각 하위 문자열은 주어진 길이에 패턴과 일치합니다.

아래 예에서는 패턴이 구분되어 -있으며 길이는 3입니다. 내 질문은: 이 작업을 수행하는 더 효율적인 방법이 있습니까?

$ echo $foo
./abcd-123-efghij-45678.pdf
$ echo "$foo" | sed -E 's:([^-\.\/]{3})([^-]*):\1:g'| sed "s/$/.${foo##*.}/"
./abc-123-efg-456.pdf
$ foo=${foo%.pdf}.djvu
$ echo $foo
./abcd-123-efghij-45678.djvu
$ echo "$foo" | sed -E 's:([^-\.\/]{3})([^-]*):\1:g'| sed "s/$/.${foo##*.}/"
./abc-123-efg-456.djvu

...궁극적으로 이 명령이 필요한 것은 내부에서 교체하는 것입니다.for f in $(find . -name pattern); do mv $f $(...);done

답변1

로 단축하시면 됩니다

echo ./abcd-123-efghij-45678.pdf | sed -E 's:([^-\.\/]{3})([^-]*):\1:g; s/$/.djvu/'

하지만 그 외에는 당신이 할 수 있는 최선의 방법이 있습니다 sed.

답변2

*.txt이것이 도움이 될 것이라고 생각합니다. 예를 들어 모든 파일을 검색하고 싶습니다.

for f in $(find . -type f -name "*.txt"); 
 do 
    echo mv "$f" $(echo "$f" | sed -E 's:([^-\.\/]{3})([^-]*):\1:g;s/$/.'"${f##*.}"'/')
done

결과가 만족스러우면 echo코드를 삭제하고 다시 실행해 보세요.

답변3

이것은 간단한 perl스크립트입니다. CPU 사용량이나 메모리 소비 측면에서 이것이 더 "효율적"인지 의심스럽습니다. sed그러나 런타임에서는 차이를 거의 느낄 수 없으며 읽고, 수정하고, 사용하기가 더 쉽습니다.

#! /usr/bin/perl

use strict;
use warnings;

# default to substring lengths of 3
my $maxlen=3;
if ($ARGV[0] =~ m/^\d+$/) {  # if first arg contains only digits
  $maxlen = shift;
};

while(<>) {
  chomp;
  s/#.*|^\s*|\s*$//g;  # strip '#' comments, leading & trailng spaces
  next if (m/^$/);     # skip blank lines

  my ($path,$ext) = '';
  my $filename = $_;

  # extract path (if any)
  if (m/^(.*\/)(.*)/o) {
    ($path,$filename) = ($1,$2)
  };

  # extract filename extension (if any)
  if ($filename =~ m/(^.*)(\..*)$/) {
    ($filename,$ext) = ($1,$2);
  };

  # split into fields on '-', reduce each field to $maxlen.
  my @fields=split /-/,$filename;
  @fields = map { substr($_,0,$maxlen-1) } @fields;

  print "$path" . join('-',@fields) . $ext . "\n";
}

설명이 포함된 파일 이름으로 스크립트를 저장하고 실행 가능하게 만듭니다 chmod +x scriptname. 방금 귀하의 U&L 이름을 사용했습니다.

입력하다:

==> erwann1.txt <==
abcd-123-efghij-45678.pdf
./abcd-123-efghij-45678.djvu

==> erwann2.txt <==
gtr-tomwaits-callfromistanbul-chord-ehaugen.mp4 
gtr-tomwaits-callfromistanbul-mribot.mp4 

산출:

$ ./erwann.pl 3 erwann1.txt 
abc-123-efg-456.pdf
./abc-123-efg-456.djvu

$ ./erwann.pl 6 erwann2.txt 
gtr-tomwai-callfr-chord-ehauge.mp4 
gtr-tomwai-callfr-mribot.mp4 

다음과 같이 실행할 수 있습니다.

ls -1 *.mp4 | ./erwann.pl 6
find . -type f -name '*.pdf' | ./erwann.pl 

스크립트는 개행 문자를 제외한 모든 문자가 포함된 파일 이름을 처리합니다. 파일 이름에 개행 문자가 포함될 가능성이 있는 경우 NUL 종료 입력 레코드를 지원하도록 스크립트를 쉽게 수정할 수 있습니다(아마도 명령줄 옵션을 사용하거나 처리하기 위해) Getopt::Std.Getopt::Long

관련 정보