mv : добавить номер к имени файла, если цель существует

Размещение его на нескольких строках позволяет избежать добавления лишних ; и дает один способ написать функцию, даже если он содержит множество команд.

function kk {
    kate 2>/dev/null 1>&2 & disown
}
3
16.06.2017, 01:09
3 ответа

Хорошо, не судите меня по моим -неплохим навыкам работы с bash, но это решение сработало для меня. (Я оценил решение Byte Commanders , но из-за его ограничений это не то, что я искал)

Итак, вот мой небольшой скрипт, который выполняет эту работу...

  • $2это путь
  • $3имя файла
  • $punktpdfэто просто ".pdf"

Вот мой небольшой скрипт...

if [ -s $2$3$punktpdf ]; then
    for i in `seq 1 100000`;
        do
            if [ ! -s $2$3$i$punktpdf ]; then
                if mv scan.pdf $2$3$i$punktpdf; then                        
                    echo $3$i$punktpdf
                    exit 0
                    break
               else                        
                    echo 1
                    break
               fi
           fi
        done
    else
        #Regular mv
    fi
-1
27.01.2020, 21:18

Как уже сказано в ответе на вопрос, который вы связали, mvможет добавлять суффиксы к файлам, которые в противном случае были бы перезаписаны перемещаемым файлом, с номером, чтобы дать им уникальное имя файла:

mv --backup=t <source_file> <dest_file>

Команда работает, добавляя следующий неиспользуемый цифровой суффикс к файлу, который был первым в целевом каталоге. Перемещаемый файл сохранит свое исходное имя.

Однако это добавит суффиксы вроде .~1~, что кажется не тем, что вам нужно:

$ ls
file.pdf
file.pdf.~1~
file.pdf.~2~

Вы можете переименовать эти файлы на втором этапе, чтобы получить имена в формате, подобном file_1.pdfвместо file.pdf.~1~, например. вот так:

rename 's/((?:\..+)?)\.~(\d+)~$/_$2$1/' *.~*~

При этом все файлы, которые заканчиваются нежелательным суффиксом резервной копии (, сопоставляются с шаблоном оболочки*.~*~)и позволяют инструменту renameпопытаться сопоставить регулярное выражение ((?:\..+)?)\.~(\d+)~$в имени файла. Если это совпадает, он захватит индекс из суффикса.~1~-как вторая группа($2)и, необязательно, если имя файла имеет расширение перед этим суффиксом, например .pdf, которое будет захвачено первой группой ($1). ]. Затем он заменяет полную совпадающую часть имени файла на _$2$1, вставляя захваченные значения вместо заполнителей.

В основном он будет переименовывать, например. file.pdf.~1~до file_1.pdfи something.~42~до something_42, но он не может определить, имеет ли файл несколько расширений, поэтому, например. archive.tar.gz.~5~станетarchive.tar_5.gz

10
27.01.2020, 21:18

В то время как простое переименование файлов на основе замены -в Linux относительно несложно, следует отметить, что в дистрибутивах Linux существует несколько renameпакетов команд, как указано здесь :

.

https://stackoverflow.com/questions/31408764/using-regex-with-rename-version-from-util-linux

Эта проблема усложняется более сложным подходом к переименованию файлов с использованием regex (регулярных выражений )команд.

Решение rename, предоставленное @ByteCommander, у меня не сработало; вот особенности и решение (Я на Arch Linux ).

$ which rename
  /usr/bin/rename

$ rename --version
  rename from util-linux 2.36.1

$ pacman -Ss util-linux | grep installed
  core/util-linux 2.36.1-4 [installed]
  core/util-linux-libs 2.36.1-4 [installed]

$ cd /home/victoria/zzz/
$ pwd; ls -l
  /home/victoria/zzz
  total 16
  -rw-r--r-- 1 victoria victoria 5 Dec 17 09:17 'apples and bananas.mkv'
  -rw-r--r-- 1 victoria victoria 5 Dec 17 09:17 'apples and bananas.mkv.~123~'
  -rw-r--r-- 1 victoria victoria 5 Dec 17 09:17  apples.mkv
  -rw-r--r-- 1 victoria victoria 5 Dec 17 09:17  apples.mkv.~123~

## Note the use of bacticks ( ` ); for readability I split the `for` 
## command over two lines; however, it is a one-line command):

$ for f in *; do mv 2>/dev/null -v "$f" "`echo $f |
  sed -r 's/(.*)\.(.*)\.~([0-9]{1,})~$/\1_\3.\2/'`"; done

  renamed 'apples and bananas.mkv.~123~' -> 'apples and bananas_123.mkv'
  renamed 'apples.mkv.~123~' -> 'apples_123.mkv'

$ ls -l
  total 16
  -rw-r--r-- 1 victoria victoria 5 Dec 17 09:17  apples_123.mkv
  -rw-r--r-- 1 victoria victoria 5 Dec 17 09:17 'apples and bananas_123.mkv'
  -rw-r--r-- 1 victoria victoria 5 Dec 17 09:17 'apples and bananas.mkv'
  -rw-r--r-- 1 victoria victoria 5 Dec 17 09:17  apples.mkv

Комментарии:

0
17.12.2020, 18:01

Теги

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