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

Я собираюсь идти вперед и дать мое смещенное мнение. Я первоначально начал свою поездку Unix с OpenBSD. После того, как я действительно вошел в материал .NET на работе, я начал бездельничать с Моно. Порт OpenBSD моно довольно стар и обычно просто не работает хорошо. Так, я намеревался находить что-то лучше. То, что я нашел, было Дугой Linux

Я думаю, что существует несколько вещей о Дуге Linux, которые делают его особенно приспособленным для программирования:

  1. Чрезвычайно легкий вручную создать Ваши собственные пакеты
  2. Модель Rolling Release, таким образом, вместо того, чтобы ожидать год следующего выпуска, который выйдет так, можно получить последнее программное обеспечение, последнее программное обеспечение, обычно просто там и доступна. Здание из источника обычно не требуется получить самую актуальную (стабильную) версию стандартного программного обеспечения (т.е. компиляторы, интерпретаторы и т.д.)
  3. Целое сообщество, кажется, опытно с программированием на некотором уровне. Это - побочный эффект всего не упаковываемого в симпатичном GUI
  4. Минималистический по своей природе. Не хочу менеджер окон, не берите тот. Вы выбираете то, что первоначально установлено в Вашей системе.
  5. Огромный репозиторий "неподдерживаемого" пакета создает сценарии. Я никогда не видел часть программного обеспечения, которое не имело сценария сборки пакета для Дуги Linux. (конечно, некоторые могут быть менее, чем оптимальными, но это не поддерживается, в конце концов),
3
11.11.2013, 03:51
4 ответа

bash4: Сначала считайте отображения в массив

declare -A arr2
while IFS=, read -r -a arr; do
    arr2[${arr[0]}]="${arr[1]}";
done < mapfile.txt

И затем переименуйте

for f in [0-9][0-9][0-9].jpg; do
    if [[ "${arr2[${f%.*}]+_}" ]]
    then
        mv -- "${f}" "${f%.*}"-"${arr2[${f%.*}]}"."${f##*.}";
    else
        mv -- "${f}" "${f%.*}"-default."${f##*.}";
    fi
 done
2
27.01.2020, 21:14
  • 1
    Будет работать в zsh но не в bash или ksh93 где числа с продвижением 0 рассматривают как восьмеричные. –  Stéphane Chazelas 09.11.2013, 22:15
  • 2
    @StephaneChazelas, я протестировал это на GNU bash, version 4.2.25 перед регистрацией это работает. Я предполагаю, что это вызвано тем, что arr2 считается ассоциативным массивом по умолчанию под ударом 4, таким образом, индекс не считают "арифметическим контекстом"? –  iruvar 10.11.2013, 18:15
  • 3
    Если файл не находится в карте, он переименован к, например. 042-.jpg. Можно хотеть добавить тест для этого. –  Gilles 'SO- stop being evil' 10.11.2013, 21:41
  • 4
    @1_CR, протестируйте Вас с 008 в mapfile? –  Stéphane Chazelas 10.11.2013, 22:14
  • 5
    @StephaneChazelas, ах я вижу то, что Вы имеете в виду. Я, кажется, могу работать вокруг этого путем явного объявления arr2 ассоциативный массив. Метки этого bash4 решение –  iruvar 10.11.2013, 22:56

Можно просто выполниться

join -t. -j1 <(tr , . < map) filelist | sed 's/\./-/' | paste filelist - | xargs -L1 mv

где map контекстная карта и filelist список файлов. Соединение разделит на . и использует первое поле в качестве значения соединения; должны быть отсортированы оба списка. paste затем склеит каждую строку filelist с недавно сгенерированным именем файла вместе в одной строке, в то время как xargs затем вызовы mv на каждой из тех строк.

2
27.01.2020, 21:14

Вот:

for file in [0-9][0-9][0-9].jpg;do
    name="${file%%.*}" # Remove extension
    map="$(grep "$name" map_file | cut -d',' -f 2)"
    echo mv "$file" "$name-$map".jpg
done

Это предполагает, что "карта" находится в файле map_file. В последних версиях Bash можно также преобразовать этот файл в ассоциативный массив и использование это для удобства (вместо того, чтобы пройти map_file для каждого нового файла Вы хотите переименовать).

Между прочим, это будет только echo mv команды. Удалите echo когда Вы чувствуете, что все в порядке, чтобы на самом деле сделать переименование.

1
27.01.2020, 21:14
< map sed 's/\([^,]*\),\(.*\)/mv -- "\1.jpg" "\1-\2.jpg"/' | sh -x

(который предполагает, что файл карты не содержит ", $, обратная косая черта или символы обратной галочки.

1
27.01.2020, 21:14
  • 1
    это выглядит интересным, очень кратким, можно ли объяснить, как это работает? –  mikkelbreum 10.11.2013, 02:09
  • 2
    Если карта упомянет несуществующий файл, то Вы получите сообщение об ошибке, которое не, вероятно, желаемо. –  Gilles 'SO- stop being evil' 10.11.2013, 21:42

Теги

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