Как скопировать файлы в один каталог, используя find и xargs (GNU Bash) - PullRequest
1 голос
/ 14 апреля 2011

Мне нужно найти все файлы (например, с расширением ABC) и скопировать их в один каталог, но создать уникальные имена файлов, чтобы не перезаписывать какие-либо файлы с потенциально одинаковыми именами.

Примерно так:

find /tmp -name \*.ABC | xargs cp '{}' somedir/$(echo {} | md5sum | cut -c1-6){} \;

Создание файлов, таких как:

b786af1_original_name.ABC
a7af335_original_name_2.ABC
...

Команда выше, очевидно, не может работать, потому что оператор $ (...) вычисляется один раз. Мне нужно оценить его для каждого имени файла.

Как это сделать?

Ответы [ 5 ]

2 голосов
/ 14 апреля 2011

Почему бы не прочитать ?

find /tmp -name \*.ABC | while read i; do cp $i $(basename $i | md5sum | cut -c1-6)$(basename $i); done;
1 голос
/ 14 апреля 2011

Для справки, вот странная версия @ Ken-ответа, проверенная на имя файла:

find /tmp -name \*.ABC -print0 | while IFS= read -r -d $'\0' i; do cp "$i" "$(basename "$i" | md5sum | cut -c1-6)$(basename "$i")"; done

См. BashFAQ # 20 для деталей, вариантов и т. Д.

1 голос
/ 14 апреля 2011

Как насчет случайного int на основе текущей наносекунды?

date +%N | sed -e 's/000$//' -e 's/^0//'
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#  Strip off leading and trailing zeroes, if present.
#  Length of generated integer depends on
#  + how many zeroes stripped off.

Вероятность получения одного и того же файла с таким же именем очень мала с помощью этого метода.

Источник: http://tldp.org/LDP/abs/html/timedate.html

РЕДАКТИРОВАТЬ: на самом деле это просто даст вам ту же проблему.Это должен быть один лайнер?

0 голосов
/ 15 апреля 2011

Важная информация: обратите внимание, какую часть хеша вы используете в качестве идентификатора.

Если вы используете 6 значений 0..F (16 значений), это менее 17 миллионов комбинаций. Таким образом, если у вас есть 5000 файлов, которые вы идентифицируете с ними, у вас есть 52% шанс столкновения. 7 шестнадцатеричных символов дают 4,5%, а 8 шестнадцатеричных символов - 0,3% столкновений (для 5000 файлов).

0 голосов
/ 15 апреля 2011

Используйте mktemp для генерации уникальных имен:

find /tmp -name \*.ABC | while read f; do 
  cp "$f" "$(mktemp /destination/dir/XXXXXXXXXX.ABC)"
done
...