сортировки файлов в каталоге по подкаталогам по размеру

sed — самая полезная утилита Linux, с которой я когда-либо сталкивался.

sed 's/\t/","/g' TabSeparatedValues.txt > CommaSeparatedValues.csv
sed -i 's/.*/"&"/' CommaSeparatedValues.csv

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

1
02.09.2019, 21:43
2 ответа

Может быть скрипт типа:

#! /bin/sh -
dir=${1?Please specify the directory to sort}
cutoff=${2:-1048576} # bytes

cd -P -- "$dir" || exit
mkdir -p -- small_files large_files || exit

find. ! -name. -prune -type f '(' \
  -size "+${cutoff}c" -exec sh -c 'exec mv -- "$@" large_files' sh {} + -o \
                      -exec sh -c 'exec mv -- "$@" small_files' sh {} + ')'

В системе GNU вы можете передать параметр -vв mvи mkdir, чтобы сделать его более подробным. С помощью инструментов GNU это можно упростить до:

#! /bin/sh -
dir=${1?Please specify the directory to sort}
cutoff=${2:-1M}

cd -P -- "$dir" || exit
mkdir -p -- small_files large_files || exit

find. -maxdepth 1 -type f '(' \
  -size "+$cutoff" -exec mv -t large_files {} + -o \
                   -exec mv -t small_files {} + ')'

С этой опцией -tдля указания целевого каталога нам больше не нужно вызывать shдля вставки списка имен файлов в середину аргументов mv.

Вы можете добавить дополнительные категории, например:

find. -maxdepth 1 -type f '(' \
  -size +1M   -exec mv -t large_files  {} + -o \
  -size +100k -exec mv -t medium_files {} + -o \
              -exec mv -t small_files  {} + ')'

С помощью zshвы также можете сделать это как:

#! /bin/zsh -
dir=${1?Please specify the directory to sort}


cd -P -- "$dir" || exit

for size target (
  LG+1   huge_files
  LM+100 very_large_files
  LM+1   large_files
  LK+100 medium_sized_files
  L+100  small_files
  ''     tiny_files
) {
  mkdir -p $target || exit
  files=(*(NDoN.$size))
  (($#files == 0)) || mv -- $files $target || exit
}
3
27.01.2020, 23:22
not= && while :; do 
 while IFS= read -r -d '' f; do 
  [[ -z "${not}" ]] && target="large_files" || target="small_files"
  [[ ! -d "${target}" ]] && mkdir "${target}" 
  mv "${f} "${target}/${f}"
 done < <(find. -maxdepth 1 -type f ${not} -size +1000k -printf "%f\0" 2>/dev/random)
 [[ -n "${not}" ]] && break 
 not=!
done

Внешний цикл forдинамически изменяет размер поиска с более чем 1M на менее или равный 1M. Ошибки перенаправляются на /dev/random(, предполагая, что вы работаете в Linux, добавляете к энтропии -, измените его на /dev/null, если у вас нет/dev/random).

Целевой каталог изменяется на большие _файлы перед установкой ${not}и создается целевой каталог, если он еще не существует. Следующая итерация устанавливает ${not}в !и находит файлы, которые не превышают 1M (меньше или равны ), а также создает каталог небольших _файлов, если он еще не существует.

Файлы перемещаются в соответствующие каталоги.

После первой установки notлогика внутреннего цикла запускается еще раз после установки not, после чего цикл прерывается.

Примечание. :нулевой байт используется для обработки цикла while, поскольку он более надежен, IFS=сбрасывает внутренний разделитель полей для обработки списков, разделенных нулевыми байтами, и -d ''устанавливает разделитель в нулевой байт, -r] защищает обратную косую черту от удаления/интерпретации.

0
27.01.2020, 23:22

Теги

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