Похоже, вы не можете установить параметры по умолчанию в расширении ${@:-...}
, а "${@:-"$base/aaa" "$base/bbb"}"
раскрывается как одна строка.
Если вы хотите установить параметры по умолчанию, вы можете сделать это:
base=$(dirname -- "$0")
# test explicitly for no parameters, and set them.
if [ "$#" -eq 0 ]; then
set -- "$base/aaa" "$base/bbb"
fi
Тогда "$@"
магическая подстановка параметров в кавычках может происходить постоянно:
touch -- "$@"
Я попытаюсь найти компромисс между двумя вариантами ответа. Ниже приведен один лайнер, который выполнит то, что вам нужно:
srcdir=<Source Directory>;dstdir=<Destination Directory>;cd $srcdir;for srcfile in *;do if [ -f $dstdir$srcfile ] then $srcfile $dstdir${srcfile%.*}-copy.${srcfile##*.}; else cp $srcfile $dstdir$srcfile; fi; done
Разбито для удобства чтения, это будет выглядеть так:
srcdir=<Source Directory>
dstdir=<Destination Directory>
cd $srcdir
for srcfile in *
do
if [ -f $dstdir$srcfile ]
then
cp $srcfile $dstdir${srcfile%.*}-copy.${srcfile##*.}
else
cp $srcfile $dstdir$srcfile
fi
done
Чтобы объяснить, как это работает, вам нужно ввести исходный и целевой каталоги. Он будет перенесен в этот каталог, чтобы формат $srcfile не был полным путем и не требовал расширения строки каждый раз, когда вы используете переменную. Как и сейчас, он просматривает каждый файл из $srcdir, проверяет, существует ли этот файл в $dstdir, и если да, то вставляет копию -, а затем копирует файл в $dstdir$srcfile. между именем файла и расширением (${srcfile%. } выводит только имя файла, а ${srcfile##.} выводит только расширение ). если он не существует, он просто скопируется как обычно.
Объяснить, почему я не рассматриваю случаи множественных копий, можно потому, что в сценарии не указано более одного каталога для другого единственного каталога в единственной копии, поэтому такой случай не может существовать. При этом используйте с осторожностью, это перезапишет или добавит (в зависимости от файлов каталога src vs dst )с копией -. соглашение об именовании.
Вы можете создать простой bash-скрипт, подобный этому
#!/bin/bash
MyFolder=/my/folder
DestFold=/destinatin/folder
CpNum=10
i=0
for FlN in $MyFolder; do
FlNo = echo $FlN |awk -F\/ '{print $NF}'
if [! -f $DestFold/$FlNo ]; then
cp $FlN $DestFold/
else
FlNo = echo $FlN |awk -F\/ '{print $NF}'
while [ $i -lt $CpNum ]; do
i=$[$i+1]
if [ ! -f $DestFold/${FlNo%.txt}-copy-$i.txt ]; then
cp $FlN $DestFold/${FlNo%.txt}-copy-$i.txt
i=$CpNum
fi
done
fi
done
поэтому вы вводите папку поиска и назначения, а затем запускаете скрипт (, прежде чем сделать его исполняемым с помощью
chmod 755 yourscript
Этот сценарий будет искать файлы и помещать их в переменную (FlN )и обрезать переменную только до имени файла без папок впереди (FlNo ), а затем копировать, если такого файла нет. Если присутствует, он создаст файл с добавлением-копии -X . непосредственно перед окончанием имени файла (X — номер копии ). Переменная $CpNum
будет количеством максимальных копий каждого файла (может быть безопасно увеличена )В настоящее время работает для файлов.txt, но вы можете изменить ее. Вы можете дополнительно поиграть, чтобы добавить возможность вызова скрипта с аргументом или сделать это для множества различных расширений
rsync
— хороший первый выбор, если вы хотите скопировать все файлы и подкаталоги в каталоге. У него есть опция , а не перезаписи файлов, опция резервного копирования -b
.
Однако по умолчанию резервная копия использует схему именования, которая не подходит для этой цели (добавлен символ ~
в конце имени файла, который некоторые инструменты скрывают как ненужные файлы резервных копий ).
Существует возможность изменить его (--suffix newending
), что может быть чем угодно, но оно все еще прикрепляется в конце и не удаляет предыдущее расширение. Если это работает для вас, это легкая работа для rsync
. Обратите внимание, что это правильная резервная копия -: файлы с одинаковыми именами, которые в остальном идентичны, не будут иметь двух копий.
Например,в вашем случае потребуются две команды для заполнения пункта назначения из двух источников:
rsync -av "Folder 1/" "New Folder/"
rsync -av -b --suffix -copy.txt "Folder 2/" "New Folder/"
Обратите внимание на особые кавычки, необходимые для файлов с пробелами, и окончание /, обозначающее содержимое каталога (, начинающееся в каталоге, не включая его ).
Файлы, которые уже присутствуют в папке 1, будут прикреплены к -copy.txt
, например:
; ls -R1 New\ Folder
'New Folder':
f1.txt
f1.txt-copy.txt
f2.txt
f2.txt-copy.txt
Обновление:
Обе команды по существу синхронизируются из первого каталога во второй, и дополнительная команда действительно перезапишет все, что находится в месте назначения, параметр резервного копирования изменяет это так, что файл, который в противном случае был бы уничтожен, сохраняется в качестве резервной копии. Так что действительно, файлы из второй строки сохранят свои имена. Это все еще может быть полезно для первоначальной цели, если команды запускались в другом порядке.
То есть, если вы используете rsync с параметром резервного копирования и суффикса -, то в месте назначения будет заменен файл azad.txt
, но параметр резервного копирования сохранит предыдущий файл в месте назначения, переименованный с новым суффиксом.