Обновление :см.https://unix.stackexchange.com/a/368663/145784для полного обсуждения unix-операторов, таких как $(<
, в различных оболочках.
$(< file)
— полный бэш. Оператор < file
берет файл и перенаправляет его на stdin
команды, с которой он вызывается. В данном случае $()
является формой подстановки команд, поэтому используется вместо команды. Он принимает входные данные и преобразует их в переменную, пригодную для использования в команде. Поскольку он не вызывает внешнюю программу cat
, он работает быстрее.
Чтобы вывести эту переменную на стандартный вывод, просто запустите:
echo $(< file)
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