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

Однако теперь я хочу скопировать из src в dst/2016-01-05 НО только те файлы в src которые не существуют нигде внутри dst .

пример

Предположим, что стартовая ситуация

src/f1.txt
src/f2.txt
src/f3.txt

dst/2016-01-04/f1.txt
dst/2016-01-05/f0.txt

Затем, после выполнения копии, конечная ситуация должна быть:

src/f1.txt
src/f2.txt
src/f3.txt

dst/2016-01-04/f1.txt
dst/2016-01-05/f0.txt

dst/2016-01-05/f2.txt
dst/2016-01-05/f3.txt

В общем, я не хотел бы перезаписывать существующие файлы. Даже если источник обновлен.

1 ответ1

1

Следующее должно сделать трюк:-

today=`date +%Y-%m-%d`
ls -A src/ | while f=`line`; do if [ ! -f "dst/*/$f" ]; \
                 then mkdir -p "dst/$today"; cp "src/$f" "dst/$today/$f"; fi; done

Заметки:-

  1. По сравнению с альтернативой for f in src/*; ... , с помощью ls удаляет каталог из имени источника, а -A включает имена файлов, начинающиеся с . .
  2. Если в src/ есть подкаталоги, вам нужно использовать find в исходном каталоге и убрать src/ из имени с -printf %P\\n .
  3. Если у вас нет команды line вы можете использовать while read f; ... , но это не работает для имен файлов с пробелом в начале и в конце (даже в line не получается, если имя файла содержит символ новой строки - для этого вам нужно будет использовать find -print0 и xargs -0).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .