2017-02-03 19 views
1

Я пытался скопировать все файлы определенного типа файлов из всех подпапок в одно место. К сожалению, это может привести к конфликтам, если два файла имеют одинаковое имя из двух разных подпапок.Избегайте столкновения при копировании файлов

Я использовал

find ./ -name '*.jpg' -exec mv -u '{}' . \; 

Как я могу настроить для автоматического переименования файлов (например, добавление «_1»), чтобы избежать столкновений. Или лучше: проверьте, являются ли файлы одинаковыми (например, того же размера) заранее. Если да, проигнорируйте (переписать тоже будет хорошо). Если нет, переименуйте, чтобы избежать столкновения.

Предложение будет оценено. Благодаря!

+0

Вместо Exec 'mv', Exec' Баш -c 'ТЕСТ ДЛЯ СТОЛКНОВЕНИЯ затем mv'' –

ответ

0

Вы можете проверить перед перемещением каждого отдельного файла. Здесь я использовал cksum для сравнения, который возвращает как размер файла, так и простую контрольную сумму.

find ./ -name '*.jpg' -print0 | 
while read -d '' -r path; do 
    file=$(basename "$path") 
    if [[ -e $file ]]; then 
     if [[ $(cksum "$file" | awk '{print $1 $2}') = $(cksum "$path" | awk '{print $1 $2}') ]]; then 
      continue 
     fi 
     read -n 1 -p "File '$file' would be overwritten by '$path', continue? (y/N) " -r prompt </dev/tty 
     if [[ $prompt != [Yy] ]]; then 
      continue 
     fi 
    fi 
    mv -f -v "$path" "$file" 
done 
+0

Можем ли мы использовать 'CMP -s', чтобы увидеть, если два файла являются одинаковыми вместо двух' cksum's? – codeforester

+0

@codeforester Абсолютно, это было бы лучше. Я изначально написал 'stat -c% s', чтобы продемонстрировать идею OP, но это не переносимо (это' stat -f% z' на macOS), поэтому я поступил для 'cksum', который также выводит размер. – ephemient

+0

Хорошо, это помогает. Но я также хотел бы, чтобы у меня не было никаких подсказок. если они одинаковые, меня не волнует, если они перезаписаны или нет (если нет, файл для копирования должен быть удален предпочтительно). Но если у файлов есть другой cksum, его также следует автоматически переименовать, так как я уверен, что хочу сохранить оба файла в этом случае. – StegSchreck