Используйте 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)
С помощью 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 -).
Скрипт будет работать с именами каталогов/файлов с пробелами. Как здесь, он печатает команды вместо их выполнения. Если вы хотите на самом деле выполнять команды, удалите слово «эхо» из кода (в двух местах ).
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