Сценарий Bash для сортировки файлов в папках по алфавиту и по номерам (смещение буквы сортировки до 8-го символа)

Обновление :см.https://unix.stackexchange.com/a/368663/145784для полного обсуждения unix-операторов, таких как $(<, в различных оболочках.

$(< file)— полный бэш. Оператор < fileберет файл и перенаправляет его на stdinкоманды, с которой он вызывается. В данном случае $()является формой подстановки команд, поэтому используется вместо команды. Он принимает входные данные и преобразует их в переменную, пригодную для использования в команде. Поскольку он не вызывает внешнюю программу cat, он работает быстрее.

Чтобы вывести эту переменную на стандартный вывод, просто запустите:

echo $(< file)

0
26.09.2019, 05:01
1 ответ
rename  -n 'if (-f $_) {
   my $c=substr($_,7,1);
   if ($c) {
     mkdir $c unless (-d $c);
     $_="$c/$_" if (-d $c);
   };
}' *.ext

Здесь используется команда perlrename(, также известная как prenameи file-rename), НЕ , которую следует путать с командой renameиз util-linux, которая имеет совершенно разные и несовместимые параметры командной строки.

Сценарий перебирает все файлы в командной строке (или читает из STDIN ), и если текущий файл является обычным файлом (, то есть не каталогом, именованным каналом, сокетом и т. д. ), тогда это:

  • извлекает восьмой символ с помощью функции substr()в переменную $c. смещения substr начинаются с 0, поэтому ,7,1относится к 8-му символу.
  • если $cне пусто (, что произойдет с короткими именами файлов ), это :
    • создает каталог $c, если он не существует.
    • переименовывает текущий файл в этот каталог, если это каталог (, т.е.не ломается, если $cуже существует, но не является каталогом)

В качестве альтернативы сценарий может перемещать файлы в каталог с именем, например, Misc, если $c пуст:

rename -n 'if (-f $_) {
   my $c=substr($_,7,1);
   $c="Misc" unless ($c);
   mkdir $c unless (-d $c);
   $_="$c/$_" if (-d $c);
}' *.ext

Обратите внимание, :в обоих вышеприведенных примерах используется параметр renameсухого -запуска(-n). Они будут показывать только то, во что будут переименованы файлы /mv -, если вы позволите. Когда вы будете удовлетворены тем, что сценарий переименования будет делать то, что вы хотите, удалите опцию -n(или замените ее на -vдля подробного вывода ).

напр.

$ rename -v  'if (-f $_) { my $c=substr($_,7,1);  $c="Misc" unless ($c) ; mkdir $c unless (-d $c); $_="$c/$_" if (-d $c)}'  *
9323 - Unix.ext renamed as U/9323 - Unix.ext
foo.ext renamed as Misc/foo.ext
z223 - 50 Cent.ext renamed as 5/z223 - 50 Cent.ext
0
28.01.2020, 03:15

Теги

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