Как переместить файлы в подкаталоги старше x дней?

Используйте sort -V, если эта опция доступна

-V, --version-sort

natural sort of (version) numbers within text

$ <cmd> | sort -k5,5V
2017-10-25_09:30:22/sdq.log:Data LOST: 2.00 KB (4 sectors)
2017-10-26_09:17:59/sde.log:Data LOST: 2.00 KB (4 sectors)
2017-10-26_09:17:59/sdp.log:Data LOST: 2.00 KB (4 sectors)
2017-10-25_14:37:03/sdc.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdd.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdf.log:Data LOST: 3.00 KB (6 sectors)
2017-10-26_09:17:59/sdo.log:Data LOST: 3.00 KB (6 sectors)
2017-10-25_09:30:22/sdf.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdo.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdp.log:Data LOST: 4.00 KB (8 sectors)
2017-10-25_09:30:22/sdi.log:Data LOST: 5.00 KB (10 sectors)
2017-10-25_09:30:22/sdn.log:Data LOST: 5.00 KB (10 sectors)
2017-10-25_14:37:03/sdb.log:Data LOST: 5.00 KB (10 sectors)
2017-10-26_09:17:59/sds.log:Data LOST: 5.00 KB (10 sectors)
2017-10-26_09:17:59/sdg.log:Data LOST: 6.00 KB (12 sectors)
2017-10-26_09:17:59/sdi.log:Data LOST: 6.00 KB (12 sectors)
2017-10-26_09:17:59/sdl.log:Data LOST: 6.00 KB (12 sectors)
2017-10-25_09:30:22/sdj.log:Data LOST: 2.35 MB (4822 sectors)
2017-10-26_09:17:59/sdr.log:Data LOST: 65.29 MB (133712 sectors)
2017-10-26_09:17:59/sdq.log:Data LOST: 414.60 MB (849106 sectors)
2017-10-26_09:17:59/sdh.log:Data LOST: 611.29 MB (1251918 sectors)
3
06.01.2020, 21:01
2 ответа

С помощью zshвы можете сделать что-то вроде:

dest=/storage/9016-4EF8/WhatsApp/Media
cd /path/sourcefolder &&
  for f (**/*(ND.m+89)) {
    mkdir -p -- $dest/$f:h &&
      mv -- $f $dest/$f
  }

Вы можете сделать это быстрее, выпустив заранее zmodload zsh/files, который заменит mvи mkdirвстроенными версиями.

Или POSIXly:

cd /path/sourcefolder &&
  dest=/storage/9016-4EF8/WhatsApp/Media find. -type f -mtime +89 -exec sh -c '
     for f do
       mkdir -p -- "$dest/${f%/*}" &&
         mv -- "$f" "$dest/$f"
     done' sh {} +

(примечание:-mtime -89выбирает файлы, которым менее 89 дней, -mtime 89файлы, которым от 89 до 90 дней, и -mtime +89файлы, которым 90 дней и старше (или, по крайней мере, были в то время findбыл запущен, и обратите внимание, что здесь день относится к 24 -часовым периодам независимо от того, были ли изменения часов DST в интервале )).

В любом случае обратите внимание, что хотя mvпопытается сохранить большинство атрибутов исходных файлов при их копировании на внешний носитель, сам каталог будет создан там как новый с владельцем, разрешениями и атрибутами по умолчанию (вряд ли будет проблемой в вашем случае, так как папка назначения не звучит, она даже в файловой системе, подобной Unix -).

2
27.01.2020, 21:24

Скрипт будет работать с именами каталогов/файлов с пробелами. Как здесь, он печатает команды вместо их выполнения. Если вы хотите на самом деле выполнять команды, удалите слово «эхо» из кода (в двух местах ).

Oneliner для выполнения с использованием оболочки (/bin/sh или /bin/bash):

DAYS=89; SOURCE="/path/sourcefolder/"; DEST="/path/destinationfolder/"; find "${SOURCE}" -mtime +${DAYS}|while read -r S; do D=$(echo "${S}"|sed "s#^${SOURCE}#${DEST}#g"); DD=$(dirname "${D}"); [ -d "${DD}" ] || echo mkdir -p \"${DD}\"; echo mv -f \"${S}\" \"${D}\"; done

Пояснение:

# define number of days
DAYS=89;
# source directory
SOURCE="/path/sourcefolder/";
# destination directory
DEST="/path/destinationfolder/";
# take one by one all files from source directory
find "${SOURCE}" -mtime +${DAYS}|while read -r S; do
   # create destination file path, based on source file path
   D=$(echo "${S}"|sed "s#^${SOURCE}#${DEST}#g");
   # find directory, where distination file should be placed
   DD=$(dirname "${D}");
   # if destination directory does not exist, create it
   [ -d "${DD}" ] || echo mkdir -p \"${DD}\";
   # move source file to destination
   echo mv -f \"${S}\" \"${D}\";
done
0
27.01.2020, 21:24

Теги

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