#bash #macos #sh
#bash #macos #ш
Вопрос:
Мне нужно скопировать все файлы определенного типа в папку, что я и делаю следующим образом:
find ./ -name '*.gql' -exec cp -prv '{}' '/path/to/dir/' ';'
Но если есть два файла с одинаковым именем, хотя и расположенных в разных вложенных папках, некоторые файлы будут перезаписаны.
Можно ли сохранить все файлы, которые копируются? Может быть, переименовать скопированный файл или возможно сохранить структуру папок в целевом каталоге?
Комментарии:
1. Вы могли бы заглянуть в
-b
/--backup
, если вашcp
поддерживает это (GNUcp
поддерживает).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
, но это сработает в любом случае.