Скопируйте файлы в другую папку, используйте новое имя, если оно существует

Похоже, вы не можете установить параметры по умолчанию в расширении ${@:-...}, а "${@:-"$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 -- "$@"
0
08.02.2021, 13:40
3 ответа

Я попытаюсь найти компромисс между двумя вариантами ответа. Ниже приведен один лайнер, который выполнит то, что вам нужно:

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 )с копией -. соглашение об именовании.

0
18.03.2021, 22:31

Вы можете создать простой 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, но вы можете изменить ее. Вы можете дополнительно поиграть, чтобы добавить возможность вызова скрипта с аргументом или сделать это для множества различных расширений

1
18.03.2021, 22:31

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, но параметр резервного копирования сохранит предыдущий файл в месте назначения, переименованный с новым суффиксом.

1
18.03.2021, 22:31

Теги

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