Пакетный файл переименовывает Используя отображающийся файл

Относительно всего Unixes я не думаю, что это выполнимо.

Обычные внешние шины сегодня не используют фиксированную нумерацию для своих портов, как IDE сделал. Так, для единственных остающихся источников данных для отображения Вас нужно, названия производителя дисков, их порядковые номера или UIDs разделов.

Имена производителя не обязательно уникальны на данной машине (предположите подключение двух внешних дисков от того же ряда - они определят тождественно). Порядковые номера не "видимы с внешней стороны", как раздел UIDs.

Так, о единственном универсальном решении я могу думать, должен маркировать физические диски порядковым номером и использовать команду udevadm, данную в ответе rozcietrzewiacz, если UDEV доступен.

3
28.04.2011, 22:53
3 ответа

Нет единственной команды для всего; в этом суть наличия scriptable оболочки.

while read -r old new; do
    mv "$old.png" "$new.png"
done < map.txt
5
27.01.2020, 21:13
  • 1
    Но я хочу одну команду. Что-то как, "renamefilesfrommappingfile <mappingfile>". :) –  Steve 28.04.2011, 20:51
  • 2
    @steve: renamefilesfrommappingfile() { local old new; while read -r old new; do mv "$old" "$new"; done < "$1"; } –  user1686 28.04.2011, 20:52
  • 3
    Ха-ха. Хороший. –  Steve 28.04.2011, 20:57
  • 4
    Вы могли сделать это немного более общим путем проигрывания с $IFS прежде и после цикла с условием продолжения; –  Steven D 28.04.2011, 21:38

Без sed можно сделать замены как это в ударе:

for line in  $(< patterns) ; do  echo "Pattern: " $line " char: "  ${line/=>*/} " nr: " ${line/*=>/}; done 

('шаблоны' были бы файлом с => 1 и так далее), который приводит к:

for line in  $(< patterns) ; do
  c=${line/=>*/}
  n=${line/*=>/}
  mv $c.png $n.png 
done 

Страница справочника удара перечисляет это и другой, интересные опции под 'строковой заменой'.

Возможно, жемчуг rename интересная опция также. Это позволяет массовые переименования с шаблонами, как

rename 's/^a/1/' a*png 

На человечности это идет с perl-пакетом, afaik.

2
27.01.2020, 21:13

Это - один путь с жемчугом:

cat mapfile | perl -e 'my$h={eval join(",",<>)};while (($k,$v)=each%$h){`mv $k.png $v.png`}'

Вторая попытка:

perl -nle '(@a=map{s/^\s+//;s/\s+$//;s/'/\\'/g;$_}split/\s*=>\s*/,$_,2)and`mv \'$a[0].png\' \'$a[1].png\'`'

Работы с:

Someone's $tupid file name    =>   renamed by "simple" script?!
0
27.01.2020, 21:13
  • 1
    1 для eval'луг вход, для eval'ing barewords на правой стороне =>, и для использования `mv` вместо безопасного от пробела переименовывают (). –  user1686 28.04.2011, 20:58
  • 2
    Почему не что-то как: perl -nle 'my ($old, $new) = split /=>/; rename "$old.png", "$new.png"' mapfile. Другое преимущество предотвращения оценки состоит в том, что можно на самом деле изменить шаблон, как вопрос указывает, может быть необходимым. –  Steven D 28.04.2011, 21:20
  • 3
    @grawity: perldoc rename: Поведение этой функции варьируется дико в зависимости от Вашего внедрения систем. Например, это не будет обычно работать через границы файловой системы, даже при том, что система mv команда иногда компенсирует это. Другие ограничения включают, работает ли это над каталогами, открытыми файлами или существующими ранее файлами. Проверьте perlport и или переименовывание (2) страница справочника или эквивалентная документация по системе для деталей. [шахта курсива] –  Axeman 28.04.2011, 21:22
  • 4
    @Axeman: спасибо за головы на переименовывает! Но оценка все еще ужасна. –  Steven D 28.04.2011, 21:24
  • 5
    @Axeman: Использовать File::Copy скопировать или переместить файлы во всех кроме старинных версий Perl. –  Gilles 'SO- stop being evil' 28.04.2011, 22:33

Теги

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