У меня есть папка со всеми данными внутри с этой структурой:

Data
-> Group 1
-> Group 2
...
-> Group n

В каждом подкаталоге есть несколько файлов. Теперь я хочу создать еще один каталог с такой же структурой и переместить некоторые из этих файлов в этот новый каталог (около 20% от общего числа файлов).

New Data
-> Group 1
-> Group 2
...
-> Group n

Я думаю о том, чтобы использовать что-то для чтения структуры папок и списка файлов, а затем передать это другой команде для создания и перемещения файлов, но я еще не знаю синтаксис. Спасибо

1 ответ1

0

Вы можете добиться этого с помощью терминала. Я включил инструкции для bash и рыбных раковин. Если вы не знаете, какая у вас оболочка, вероятно, это bash.

  1. Сначала перейдите к папке, содержащей файлы, которые вы хотите переместить (Data/ папка из вопроса).

    • Bash & Fish: cd /path/to/folder
  2. Определите, где вы хотите хранить перемещенные файлы. Это может быть либо относительный путь, либо абсолютный путь.

    • Bash: export NEW_DIR="../New Data"
    • Рыба: set NEW_DIR "../New Data"
  3. Определите долю файлов для перемещения, если вы хотите, чтобы 20%, установите его на 5 (что будет 1/5 = 0,2 = 20%):

    • Bash: export FRACTION=5
    • Рыба: set FRACTION 5
  4. Запустите следующую однострочную. Смотрите ниже для более читаемой версии:

    • Bash:

      find . -type f | xargs -I _ dirname _ | sort | uniq -c | while read n d; do echo "=== $d ($n files) ==="; if [ $(($n / $FRACTION)) -gt 0 ]; then find "$d" -type f | sort -R | head -n $(($n / $FRACTION)) | while read file; do echo "$file  ->  $NEW_DIR/$d"; mkdir -p "$NEW_DIR/$d"; mv "$file" "$NEW_DIR/$d"; done; fi; echo; done
      
    • Рыба:

      find . -type f | xargs -I _ dirname _ | sort | uniq -c | while read n d; echo "=== $d ($n files) ==="; if math "$n/$FRACTION > 0" > /dev/null; find "$d" -type f | sort -R | head -n (math "$n" / $FRACTION) | while read file; echo "$file  ->  $NEW_DIR/$d"; mkdir -p "$NEW_DIR/$d"; mv "$file" "$NEW_DIR/$d"; end; end; echo; end
      
  5. Сценарий печатает каждый файл, который он перемещает, поэтому легко увидеть, что он перемещал.

Читаемый bash-скрипт:

find . -type f | xargs -I _ dirname _ | sort | uniq -c | while read n d; do
  echo "=== $d ($n files) ===";
  if [ $(($n / $FRACTION)) -gt 0 ]; then
    find "$d" -type f | sort -R | head -n $(($n / $FRACTION)) | while read file; do
      echo "$file  ->  $NEW_DIR/$d";
      mkdir -p "$NEW_DIR/$d";
      mv "$file" "$NEW_DIR/$d";
    done;
  fi;
  echo;
done

Читаемый скрипт рыбы:

find . -type f | xargs -I _ dirname _ | sort | uniq -c | while read n d;
  echo "=== $d ($n files) ===";
  if math "$n/$FRACTION > 0" > /dev/null;
    find "$d" -type f | sort -R | head -n (math "$n" / $FRACTION) | while read file;
      echo "$file  ->  $NEW_DIR/$d";
      mkdir -p "$NEW_DIR/$d";
      mv "$file" "$NEW_DIR/$d";
    end;
  end;
  echo;
end

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .