Команда Unix TAR с предыдущим результатом нахождения

Вы можете попробовать:

for z in ./*.zip
do name="${z%%_*}"; dest=".${name//[ .-]/}"; mkdir "$dest"; unzip "$z" -d "$dest"
done

Для каждого IP-файла z он извлекает часть имени ( $ {z% % _ *} жадно удаляет суффикс) затем удаляет все вхождения точки, тире и пробела ( $ {name // [.-] /} ) и передает полученную строку в качестве аргумента в mkdir , чтобы создать соответствующий каталог. Затем он распаковывает архив в указанное место расположения d .

4
23.07.2018, 15:31
4 ответа

С 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не подлежат пост--автоматической надежной обработке, они предназначены только для потребления человеком.

11
27.01.2020, 20:44

С 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.

4
27.01.2020, 20:44

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

3
27.01.2020, 20:44

Я просто хочу добавить причину, по которой ваша команда не работает

find./ -type f -ls | grep 'Feb 28' | tar -czf somefile3.tar --null -T -

Выводом find является список имен файлов вместе с другой информацией, такой как дата. Grep выводит полные строки с соответствующей датой. Tar ожидает только имена файлов, и он ожидает, что они разделены нулевыми -байтами, а не новыми строками.

3
27.01.2020, 20:44

Теги

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