Поиск файлов по определенному времени, например. изменено за последние 14 дней

С bash4.4+ и в системе GNU вы можете сделать:

readarray -td '' files < <(
  shopt -s nullglob dotglob
  printf '%s\0' * | sort -Rz
)

для заполнения массива $filesперемешанным списком всех файлов в текущем каталоге.

Затем вы можете переместить 30% из них с помощью чего-то вроде:

echo mv -- "${files[@]:0:${#files[@]}*30/100}" /target/directory/

(удалите echoкогда вы будете уверены, что он будет делать то, что вы хотите ).

Эквивалентом в оболочке zshможет быть что-то вроде:

files=(*(NDnoe['REPLY=$RANDOM']))
echo mv -- $files[1,$#files*30/100] /target/directory/

Тот же подход, только более лаконичный и не требующий внешних утилит. Перевод:

  • shopt -s nullglob-> Nквалификатор glob (создает пустой массив, когда файла нет ).
  • shopt -s dotglob-> Dквалификатор glob (не исключает файлы, имена которых начинаются с точки ).
  • GNUsort -Rz:noe['REPLY=$RANDOM'](перетасовать список, отсортировав его в случайном порядке ).
  • ${array[@]:offset:length}->$array[first,last](zsh теперь также поддерживает синтаксис оболочки Korn, но я нахожу zsh более разборчивым ).
  • С bashмы используем записи с разделителями NUL(-d ''/ -z/ \0), чтобы иметь возможность работать с произвольными именами файлов. В zshэто не нужно, так как список никогда не преобразуется в одну строку/поток.
1
26.11.2020, 18:50
1 ответ

Вы можете использовать findс mtime/ ctime/ atimeдля времени модификации, изменения метаданных или доступа и +14в течение двух недель.

find <path> -type f -ctime +14 -delete

(Я предлагаю сначала протестировать это с помощью -printвместо -delete, чтобы убедиться, что все работает правильно.)

1
18.03.2021, 22:47

Теги

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