Вы можете попробовать:
for z in ./*.zip
do name="${z%%_*}"; dest=".${name//[ .-]/}"; mkdir "$dest"; unzip "$z" -d "$dest"
done
Для каждого IP-файла z
он извлекает часть имени ( $ {z% % _ *}
жадно удаляет суффикс) затем удаляет все вхождения точки, тире и пробела ( $ {name // [.-] /}
) и передает полученную строку в качестве аргумента в mkdir
, чтобы создать соответствующий каталог. Затем он распаковывает архив в указанное место расположения d
.
С GNU или FreeBSD find
и GNU или BSDtar
:
find. -type f -newermt 2018-02-28 ! -newermt 2018-03-01 -print0 |
tar -cf file.tar --null -T -
(обратите внимание, что он исключает файлы, последние -измененные точно в нано -секунду 2018 -02 -28T00 :00 :00.000000000 (и может включать файл в то время, когда на следующий день ), что в файловых системах с гранулярностью нано -секунд почти никогда не произойдет, если только файлы не были созданы с touch -t
/ touch -d
или сами были извлечены из архивов, которые не хранят временные метки с суб-секундами. точность)
В соответствии с POSIX и при условии, что имена файлов не содержат символов новой строки (стандартный формат архива tar также имеет дополнительные ограничения на имена файлов):
touch -d 2018-02-28T00:00:00.start
touch -d 2018-03-01T00:00:00.end
find. -type f -newer.start ! -newer.end ! -path./.start ! -path./.end |
pax -x ustar -w > file.tar
Если вы хотите, чтобы все обычные файлы последний раз изменялись 28 февраля, а не только 2018 года, с помощью инструментов GNU:
find. -type f -printf '%Tm-%Td-%p\0' |
sed -nz 's/^02-28-//p' |
tar -cf file.tar --null -T -
Выходные данные find -ls
не подлежат пост--автоматической надежной обработке, они предназначены только для потребления человеком.
С star
ваша командная строка выглядит:
touch -t201802280000 ref
star -c -f file.tar -find. -newer ref
Кстати,:-newermt может стать хорошим улучшением для libfind
в будущем.
Если вам также нравится дата окончания:
touch -t201802280000 start
touch -t201802282359.59 end
star -c -f file.tar -V pat='start!end' -find. -newer start ! -newer end
Обратите внимание, что вы должны либо опустить одну секунду, либо получить два дня, если год был високосным.
Поскольку 2018 год не високосный, вы можете использовать touch -t201803010000 end
.
find
имеет опции даты . ты их пробовал?
-newermt last modified date
-newerat last accessed date
-newerct last date that permissions changed
например :find. -newermt 2018-07-10 ! -newermt 2018-7-11 | xargs tar -cfv file.tar
РЕДАКТИРОВАТЬ как Чарльз Даффи комментарий, чтобы избежать этой проблемы :find. -newermt 2018-07-10 ! -newermt 2018-7-11 -print0 | xargs -0 tar -cfv file.tar
Я просто хочу добавить причину, по которой ваша команда не работает
find./ -type f -ls | grep 'Feb 28' | tar -czf somefile3.tar --null -T -
Выводом find является список имен файлов вместе с другой информацией, такой как дата. Grep выводит полные строки с соответствующей датой. Tar ожидает только имена файлов, и он ожидает, что они разделены нулевыми -байтами, а не новыми строками.