Поиск строки в файле и переименование нескольких файлов в результаты

Используйте Apparix . Это позволяет вам определять закладки для ваших каталогов. Затем переключаться между ними, после настройки, так же просто, как

to foo
# Goes to /this/is/a/complex/path/for/foo

to bar
# Goes to /a/completely/unrelated/path/for/bar

to foo subdir
# Goes to /this/is/a/complex/path/for/foo/subdir

Etc. И все ярлыки и подкаталоги заполняются автоматически.

Это чрезвычайно мощный и очень недооцененный инструмент. Я считаю, что он работает лучше, чем такие альтернативы, как автопереход, потому что дает пользователю больше контроля.

1
02.11.2016, 20:35
3 ответа

find. -type f -exec egrep -il '^ foo' {} \; | сортировать | while IFS = '' читать -r строка; do mv -n "$ line" "$ (dirname" $ ​​line ")" '/' "$ (egrep -i '^ foo'" $ line "| awk '{print $ 2}')"; done

0
27.01.2020, 23:47

Вы можете делать то, что вы пытаетесь выполнить, используя 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);
}
0
27.01.2020, 23:47

Я бы использовал shell for-loop:

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
27.01.2020, 23:47

Теги

Похожие вопросы