Размещение его на нескольких строках позволяет избежать добавления лишних ;
и дает один способ написать функцию, даже если он содержит множество команд.
function kk {
kate 2>/dev/null 1>&2 & disown
}
Хорошо, не судите меня по моим -неплохим навыкам работы с 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
Как уже сказано в ответе на вопрос, который вы связали, 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
В то время как простое переименование файлов на основе замены -в 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
Комментарии:
С помощью команды регулярного выражения sed
я захватываю три части имени исходного файла, а затем переставляю их; см. (напр.)https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.htmlдля пояснений синтаксиса и/или поиска в Интернете групп захвата регулярных выражений и обратных ссылок, например.https://www.regular-expressions.info/refcapture.html
Я получаю предупреждения от приведенной выше команды, которые я игнорирую (перенаправить/скрыть )с помощью2>/dev/null
См. также комментарии :к командам rename
(и )и использованию команды find
для переименования файлов.