Поменять ряд имен файлов условно

226
dexter

Если есть следующие проблемы: у меня есть ряд файлов, которые приходят в парах (но не всегда). Есть 2400 ?????? _ 001.jpg и 2400 ?????? _ 002.jpg. Мне нужно поменять местами _001 и _002. Поэтому я подумал, что смогу сделать это:

for f in $(find -type f -name "*_002.jpg"); do mv "$" "$_003.jpg"; done for g in $(find -type f -name "*_001.jpg"); do mv "$" "$_002.jpg"; done for h in $(find -type f -name "*_003.jpg"); do mv "$" "$_001.jpg"; done 

Странно, после шага 2 у меня есть * _003.jpg и * _002.jpg, которые идентичны. Что здесь происходит?

Тогда проблема становится немного сложнее: я хочу поменять местами только если оба члена пары существуют. Иногда существует только 2400 ?????? _ 001.jpg, а 2400 ?????? _ 002.jpg отсутствует. Если это так, то я хочу оставить 2400 ?????? _ 001.jpg в покое.

2

1 ответ на вопрос

0
chaos

Попробуйте это в bashоболочке:

find -type f -name "*_001.jpg" -print0 | while read -d $'\0' f; do t=$(mktemp --tmpdir=$(dirname "$f")) [ -f "$_002.jpg" ] && \ mv -v "$f" "$t" && mv -v "$_002.jpg" "$f" && mv -v "$t" "$_002.jpg" done 

Как скрипт, он должен выглядеть так (немного более читабельно):

#!/bin/bash find -type f -name "*_001.jpg" -print0 | while read -d $'\0' f; do t=$(mktemp --tmpdir=$(dirname "$f")) [ -f "$_002.jpg" ] && \ mv -v "$f" "$t" && \ mv -v "$_002.jpg" "$f" && \ mv -v "$t" "$_002.jpg" done 

Объяснение:

  • Сначала мы создаем список файлов с find. Для обработки странных имен файлов используйте -print0для разделения файлов с нулевым байтом
  • while read -d $'\0' f: Чтение вывода с findразделителями, равным nullbyte
  • Создать временный файл
  • Проверьте, существуют ли оба файла
  • Переместить оригинал (001) в временный файл
  • Переместить 002 в 001
  • Переместить временный файл в 002
Когда я помещаю этот скрипт в .sh, чтобы я мог использовать его в командной строке, я получаю 6: read: Illegal option -d. Когда я копирую скрипт прямо в командную строку, он выполняется, но странным образом я не вижу никаких изменений. За исключением создания временных. Затем в строке [-f "$ "] && [-f "$ _002.jpg"] Я полагаю, вы проверяете, существуют ли оба. Но вам не нужно проверять существование первого, не так ли? dexter 8 лет назад 0
@dexter Какую оболочку вы используете? Какая версия bash? `bash - версия` chaos 8 лет назад 0
@dexter В скрипте вы должны использовать `#! / bin / bash` в качестве первой строки chaos 8 лет назад 0
Я пытаюсь @chaos ... dexter 8 лет назад 0
GNU bash, версия 4.3.11 (1) -релиз (x86_64-pc-linux-gnu). Поэтому я сначала скопировал все в файл iswp.sh, а затем: sh iswp.sh. dexter 8 лет назад 0
@dexter Я отредактировал свой ответ, и ты прав; первый `[-f" $ "]` конечно не нужен. chaos 8 лет назад 0
Я действительно думаю, что скрипт должен работать, но по какой-то причине в моей системе это не так. Это ничего не меняет, кроме создания временных байтов длиной 0 байт ... dexter 8 лет назад 0
Никаких изменений не видно, но он распечатывает это, что, как и следовало ожидать: './2400A00/2400A00118_001.jpg' -> './2400A00/tmp.iSUZcuMKEM' './2400A00/2400A00118_002.jpg' -> './2400A00/2400A00118_001.jpg' './2400A00/tmp.iSUZcuMKEM' -> './2400A00/2400A00118_002.jpg' Кстати, в моей системе находка | пока комбинация не сработала. Мне пришлось изменить его на: для f в $ (найти -type f -name "* _001.jpg"); делать dexter 8 лет назад 0
@dexter Что такое ОС? chaos 8 лет назад 0
Это Ubuntu 14.04. Но я начинаю думать, что в последнее время на моей машине происходит слишком много странных вещей. Очень медленный доступ к простым текстовым файлам (240 байт) занимает более 20 с. чтобы открыть .... думаю, что контроллеры, возможно, дерьмо. dexter 8 лет назад 0
@dexter Я протестировал выше в Ubuntu 12.04, и это сработало. Как вы упомянули в комментарии, команда `mv` правильно печатает пути, поэтому файл перемещается. Может быть, если вы работаете с браузером файлов GUI, каталог не обновляется. chaos 8 лет назад 0
Я уверен, что это работает, выглядит хорошо и имеет смысл. Нужно выяснить, что здесь не так. Даже перезагрузка не поможет. dexter 8 лет назад 0