Выбор файлов Randon из дерева папок

#matlab #file-io #directory

#matlab #file-io #каталог

Вопрос:

У меня есть такая организация папок

 root/folder_1/file1_1 --up to-- file_5693
root/folder_2/file2_1 --up to-- file_100
root/folder_3/file3_1 --up to-- file_600
root/folder_4/file4_1 --up to-- file_689
  

Я хотел бы выбрать некоторое количество (например, 1000) случайных файлов в каждой папке и поместить их все вместе в выходную папку, но для папок, содержащих менее 200 файлов, я бы хотел скопировать все файлы.

 root_2/output:
file1_350
.
.
.
file2_1 --> file2_100
.
.
.
etc
  

как я могу это сделать?

Я попытался перечислить имена всех папок в каталоге с помощью dir команды, но номера папок не являются последовательными. Любая помощь?

Ответ №1:

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

Вы можете просто изменить следующие четыре переменные ROOT_DIR , OUT_DIR THRESHOLD_COPY и N_RANDOM_COPY .

 % Define 
ROOT_DIR = './'; % where the subdirectories are located
OUT_DIR = './root2'; % copy destination
THRESHOLD_COPY = 200; % threshold for copying all files
N_RANDOM_COPY = 100; % number of files that you want to copy

dirList = dir(ROOT_DIR);
dirList = dirList(3:end); % first two are ./ and ../
dirOnlyIndicators = cell2mat({dirList.isdir});

dirs = dirList(dirOnlyIndicators);
for dirIterator = transpose(dirs)
  subdirList = dir([ ROOT_DIR dirIterator.name]);
  fileIndicators = ~cell2mat({subdirList.isdir});
  subfileList = {subdirList(fileIndicators)};
  nFiles = sum(fileIndicators);
  copyIndices = [];
  if nFiles > THRESHOLD_COPY
    copyIndices = randperm(nFiles);
    copyIndices = copyIndices(1:N_RANDOM_COPY);
  else
    copyIndices = 1:nFiles;
  end

  for copyIndex = copyIndices
      copyfile([ ROOT_DIR dirIterator.name '/' subfileList{copyIndex}.name],...
        [OUT_DIR '/' subfileList{copyIndex}.name],...
        'f');
  end
end