Копировать структуру каталогов со случайным количеством файлов

Есть ли элегантный и быстрый способ скопировать определенную структуру каталогов и выбрать только случайное количество файлов для копирования с ней. Так, например, у вас есть структура:

--MainDir
  --SubDir1
    --SubSubDir1
      --file1
      --file2
      --...
      --fileN
    --...
    --SubSubDirN
      --file1
      --file2
      --...
      --fileN
  --...

Я хочу скопировать всю структуру папок, но выбрать для копирования только определенное количество случайных файлов из {files1-filesN} каждого SubSubDir.

0
31.05.2017, 13:40
2 ответа

Поскольку вы пометили это как linux, я предполагаю Утилиты GNU.

Скопируйте структуру каталогов из $src в $dest:

find "$src" -type d -print0 | cpio -padmv0 "$dest"

Также скопируйте случайную выборку файлов $nfile из каждого конечного подкаталога . ]$src:

find "$src" -type d -links 2 -exec \
    sh -c 'find "$1" -type f -print0 | shuf -z -n "$2"' sh {} "$nfiles" \; | \
    cpio -padmv0  "$dest"

Здесь первая find находит конечные подкаталоги (-ссылки 2), затем вторая find находит файлы в каждом из эти подкаталоги. shuf выбирает случайную выборку файлов и, наконец, cpio копирует их.

1
28.01.2020, 02:45

Сначала найдите все каталоги:

find MainDir -type d

Затем разберите эти каталоги на скрипт

find MainDir -type d -exec ./randomCopy.sh 2 {} \;

, который

  1. Создает целевой каталог
  2. Копирует случайное количество файлов.

В этом случае копируются 2 случайных файла.

В моем примере скрипт randomCopy.sh выглядит так:

#!/bin/bash                                                                                                                                                                                                                                                                    
cnt="$1"                                                                                                                                                                                                                                                                     
dir="$2"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
mkdir -p "TARGET/$dir"                                                                                                                                                                                                                                                       

# see: https://stackoverflow.com/questions/414164/how-can-i-select-random-files-from-a-directory-in-bash                                                                                                                                                                     
find "$dir" -maxdepth 1 -type f | sort -R | tail -n $cnt | while read file; do                                                                                                                                                                                               
  # copy the file                                                                                                                                                                                                                                                            
  cp "$file" "TARGET/$dir/"
done

И не забудьте сделать скрипт исполняемым: chmod +x randomCopy.sh.

Замените строку TARGET вашим целевым каталогом или используйте третий вариант скрипта.

Это доказательство концепции работает в моем тестовом каталоге, но может многое улучшить.

0
28.01.2020, 02:45

Теги

Похожие вопросы