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

2

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

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

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

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

dexter
источник

Ответы:

0

Попробуйте это в bash ракушка:

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

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

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

Объяснение:

  • Сначала мы создаем список файлов с find, Для обработки странных имен файлов используйте -print0 разделять файлы нулевым байтом
  • while read -d $'\0' f: Прочитать вывод find ограниченный нулевым байтом
  • Создать временный файл
  • Проверьте, существуют ли оба файла
  • Переместить оригинал (001) в временный файл
  • Переместить 002 в 001
  • Переместить временный файл в 002
chaos
источник
Когда я помещаю этот скрипт в .sh, чтобы я мог использовать его в командной строке, я получаю 6: read: Illegal option -d. Когда я копирую скрипт прямо в командную строку, он выполняется, но странным образом я не вижу никаких изменений. За исключением создания временных. Затем в строке [-f "$ {f}"] & amp; & amp; [-f "$ {f% _001.jpg} _002.jpg"] Полагаю, вы проверяете, существуют ли оба. Но вам не нужно проверять существование первого, не так ли?
dexter
@dexter Какую оболочку вы используете? Какая версия bash? bash --version
chaos
@dexter В сценарии вы должны использовать #!/bin/bash как первая строка
chaos
Я пытаюсь @chaos ...
dexter
GNU bash, версия 4.3.11 (1) -релиз (x86_64-pc-linux-gnu). Поэтому я сначала скопировал все в файл iswp.sh, а затем: sh iswp.sh.
dexter