在文件中搜尋字串並將多個文件重新命名為結果

在文件中搜尋字串並將多個文件重新命名為結果

我正在嘗試遞歸搜尋文件列表,如果該文件包含字串,則將該文件重命名為該字串的 grep 結果。

範例文件包含以下內容:

file1   
foo bar1

file2
foo bar2

file3
foo bar3

file4
foo bar4

file5
foo bar5

grep + awk 回傳我需要的結果:

$ grep -r "^foo" . | awk '{print $2}'
bar1
bar2
bar3
bar4
bar5

我堅持將這些結果傳遞給 mv 命令。

$ grep -r "^foo" . | awk '{print $2}' | xargs -I{} mv {} .
mv: cannot stat 'bar1': No such file or directory
mv: cannot stat 'bar2': No such file or directory
mv: cannot stat 'bar3': No such file or directory
mv: cannot stat 'bar4': No such file or directory
mv: cannot stat 'bar5': No such file or directory

提前致謝。 Gnu/BSD Grep 都有相同的結果。

答案1

我會使用 shell for 迴圈:

for match in "$(grep -ro '^foo.*')";do
    echo mv "${match%:*}" "${match#*:}"
done

這將迭代所有匹配file:matching-substring,並使用%#字串運算符刪除所有內容。之後的所有內容,包括:.

請注意,如果您確實想匹配整行而不是僅匹配模式的子字串,請使用

for match in $(grep -r '^foo');do

確保使用雙引號,因為符合項目和/或檔案名稱可能包含空格。

如果您想按一種模式進行匹配,但將檔案重新命名為匹配行中的第二個單字:

for match in "$(grep -ro '^foo.*')";do
    fname=$("echo ${match#*:}|awk '{print $2}'")
    echo mv "${match%:*}" "$fname"
done

答案2

您可以使用 perl 完成您想要完成的任務:

#!/usr/bin/env perl
use strict;

my $dir = "/path/to/directory";
chdir $dir or die "Cannot open $dir!";

my @files = grep { -f } glob("*");

foreach my $file(@files) {
  open F1, "<", $file or die "Cannot open file $file! $!\n";
  while ( <F1> ){
    chomp;
    my @strings = split(' ');
    if($strings[1] =~ /bar/){
      system("/bin/mv $file $strings[1]");
    }
  }
  close(F1);
}

答案3

find . -type f -exec egrep -il '^foo' {} \; | sort | while IFS='' read -r line; do mv -n "$line" "$(dirname "$line")"'/'"$(egrep -i '^foo' "$line" | awk '{ print $2 }')"; done

相關內容