Скопіюйте кожен файл у структурі каталогу у певний шлях, лише якщо файл там уже не існує


8

Хочеться скопіювати кожен файл із структури каталогів у певний каталог, лише якщо файл там уже не існує.

Отримала першу частину з цього питання щодо переповнення стека :

find . -type f -exec cp {} /target-directory \;

Як я можу перевірити, чи файл існує чи ні? Якщо ні, скопіюйте файл, інакше пропустіть.


Ви маєте на увазі "копіювати всі файли у вихідному дереві в (конкретний) єдиний каталог без підкаталогів"? Або "скопіювати всі файли у вихідному дереві в підкаталог каталогів призначення, подібний до того, де він був у вихідному дереві"? Я читаю питання як перший випадок - чи можете ви відредагувати це питання для уточнення? (Я знаю, у вас є ваша відповідь, але її прочитають та використовуватимуть інші.)
Волкер Зігель,

Відповіді:


13

Ви можете використовувати -uперемикач з cpкоманди:

копіюйте лише тоді, коли файл SOURCE новіший за цільовим файлом або коли файл відсутній

або використовувати rsyncкоманду з --ignore-existing:

пропустити оновлення файлів, які існують на приймачі

Приклад:

rsync --ignore-existing source/* destination/

3

Ваша оригінальна команда може бути переписана як:

find . -type f -exec bash -c 'test -e /target-directory/"$1" || cp "$1" /target-directory' sh {} \;

Ключовим тут є те, що ми викликаємо оболонку з певними командами і передаємо знайдений файл як $1аргумент. Якщо test -e /target-directory/"$1"не вдалося, це означає, що файл не існує, і в цьому випадку cpбуде скопійовано файл.

Загалом, можна використовувати інші команди, доки команда може перевірити наявність файлу. Деякі з інших варіантів:

  • /usr/bin/realpath -e /target-directory/"$1" > /dev/null || cp "$1" /target-directory
  • stat >/dev/null /target-directory/"$1" || cp "$1" /target-directory/"$1"

2
Навіщо statперевіряти наявність файлу в Bash? Не test -eбуло б набагато простіше?
Девід Фоерстер

@DavidFoerster Немає конкретних причин. тестова команда теж зробить. Свою відповідь я відредагую пізніше, якщо не забуду
Сергій Колодяжний,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.