Копирование файлов определенного типа, но предотвращение перезаписи файлов

#bash #macos #sh

#bash #macos #ш

Вопрос:

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

 find ./ -name '*.gql' -exec cp -prv '{}' '/path/to/dir/' ';'
  

Но если есть два файла с одинаковым именем, хотя и расположенных в разных вложенных папках, некоторые файлы будут перезаписаны.

Можно ли сохранить все файлы, которые копируются? Может быть, переименовать скопированный файл или возможно сохранить структуру папок в целевом каталоге?

Комментарии:

1. Вы могли бы заглянуть в -b / --backup , если ваш cp поддерживает это (GNU cp поддерживает).

2. @BenjaminW. Я нахожусь на компьютере Mac, и он не поддерживается cp, который я использую

Ответ №1:

c.f.https://ss64.com/osx/cp.html : Historic versions of the cp utility had a -r option its use is strongly discouraged, as it does not correctly copy special files, symbolic links, or fifo's. Вы можете использовать -n для предотвращения перезаписи, но для более сложной логики, вероятно, потребуется пользовательский код.

 dest=/path/to/dir
while IFS= read -r -d '' filename # read null-delimited list from find 
do basename="${filename##*/}"
   if [[ -e "$dest/$basename" ]] 
   then ctr=0
        while [[ -e "$dest/$basename.$((  ctr))" ]]; do : ; done # find available name
        mv "$dest/$basename" "$dest/$basename.$ctr"
   fi
   cp -pv "$filename" "$dest/$basename"     
done < <( find ./ -name '*.gql' -type f -print0 ) # null-delimit
  

Комментарии:

1. Если вы абсолютно уверены, что не будет файлов со «странными» именами, вы можете упростить find / read , но это сработает в любом случае.