В настоящее время я работаю над восстановлением некоторых файлов журналов из случайных резервных копий, которые я сделал. У меня 48 файлов в 70+ папках.
Как я могу переместить эти 48 файлов в одну папку, не перезаписывая файлы с одинаковыми именами? Большинство этих файлов имеют одинаковое имя, но разный размер, я проверил с помощью fdupes
.
Введите эту команду в своем терминале ( Ctrl kbd> + Alt kbd> + T kbd>, чтобы открыть ее):
find $LOG_DIR -type f | xargs -I {} sh -c 'base=$(basename "$1"); name=${base%.*}; ext=${base##*.}; mv "$1" "$OUTPUT_DIR/$name`date +%N`.$ext"' -- {}
По сути, он найдет все ваши файлы в $ LOG_DIR (который вы должны заменить замещением родителя из ваших 70 папок), извлечет имя без пути ( basename ), разделит имя и расширение а затем переместите их в $ OUTPUT_PATH (замените тем, куда вы хотите, чтобы они пошли) и добавьте число наносекунд в это время ( data +% N ) к имени, чтобы не перезаписывать.
PS: я получил небольшую помощь оттуда: StackOverflow
Сначала используйте find
, как указано выше, чтобы найти файлы, которые вы хотите переместить:
find /dir/with/scattered/logs -type f
Это просто напечатает список файлов. Если вы довольны этим, просто используйте cp
с опцией резервного копирования, это «сделает резервную копию каждого существующего файла назначения». Поскольку вы сказали, что имена не имеют большого значения, это должно быть хорошо. К файлам резервных копий будет добавлено «~». См. man cp
для лучшего контроля над этой функцией.
find /dir/with/scattered/logs -type f -exec cp -b {} /destination/directory \;
Это будет копировать файлы один за другим, что менее эффективно, чем при использовании xargs
, но для количества файлов, о которых вы упоминаете, это не должно быть проблемой.