2016-10-29 4 views
3

У меня есть каталог с файлами, приходящими на каждый день. Теперь я хочу закрепить эти группы файлов по датам. Нужно ли вообще группировать/перечислять файлы, которые высадились в тот же день.Получить список групп файлов по дате

Предположим, что ниже файлы в каталоге

-rw-r--r--. 1 anirban anirban 1598 Oct 14 07:19 hello.txt 
-rw-r--r--. 1 anirban anirban 1248 Oct 14 07:21 world.txt 
-rw-rw-r--. 1 anirban anirban 659758 Oct 14 11:55 a 
-rw-rw-r--. 1 anirban anirban 9121 Oct 18 07:37 b.csv 
-rw-r--r--. 1 anirban anirban  196 Oct 20 08:46 go.xls 
-rw-r--r--. 1 anirban anirban 1698 Oct 20 08:52 purge.sh 
-rw-r--r--. 1 anirban anirban 47838 Oct 21 08:05 code.java 
-rw-rw-r--. 1 anirban anirban 9446406 Oct 24 05:51 cron 
-rw-rw-r--. 1 anirban anirban 532570 Oct 24 05:57 my.txt 
drwxrwsr-x. 2 anirban anirban  67 Oct 25 05:05 look_around.py 
-rw-rw-r--. 1 anirban anirban 44525 Oct 26 17:23 failed.log 

Так что нет никакого способа, чтобы сгруппировать файлы с любым суффиксом/приставкой, так как все они уникальны. Теперь, когда я запустил команду, которую я ищу, я получу набор строк, как показано ниже, на основе группы по датам.

[ [hello.txt world.txt a] [b.csv] [go.xls purge.sh] [code.java] ... ] and so on. 

С этим списком я буду цикл через и сделать архив

tar -zvcf Oct_14.tar.gz hello.txt world.txt a 
+0

Помог ли он, если вы сможете размещать файлы в разных каталогах на основе их дат? –

+0

@SulavTimsina Если вы можете дать этот код .. Я могу сделать так, чтобы это случилось с zip: :) –

ответ

2

Если у вас есть версии GNU команды date, вы можете получить дату модификации файла с -r флагом, что может быть очень полезно. Например, учитывая список файлов в вашем вопросе, date +%b_%d -r hello.txt выведет Oct_14.

Используя это, вы могли бы перебираем файлы, и создать битуминозных файлы:

  • Если архивный файл не существует, создайте его с одним файлом
  • Если архивный файл существует, добавить файл к нему
  • После цикла, почтовый деготь файлы

Как это:

#!/usr/bin/env bash 

tarfiles=() 

for file; do 
    tarfile=$(date +%b_%d.tar -r "$file") 
    if ! [ -f "$tarfile" ]; then 
     tar cf "$tarfile" "$file" 
     tarfiles+=("$tarfile") 
    else 
     tar uf "$tarfile" "$file" 
    fi 
done 

for tarfile in "${tarfiles[@]}"; do 
    gzip "$tarfile" 
done 

Передайте список файлов, которые вы хотите архивировать в качестве параметров командной строки, например, если /path/to/files - это каталог, в который вы хотите архивировать файлы (перечисленные в вашем вопросе), и вы сохраняете этот скрипт в ~/bin/tar-by-dates.sh, то вы можете использовать как это:

cd /path/to/files 
~/bin/tar-by-dates.sh * 
+0

В коде нет ошибки, по крайней мере, когда я бегу, ничего не появляется в консоли. Пробовал с 'set -x', по какой-то причине он не входит в цикл for. –

+0

Передайте список файлов, которые вы хотите архивировать, в качестве параметров командной строки. Я добавил немного больше объяснений. – janos

+0

Напишите еще один скрипт, обернутый вокруг этого, введя в него необходимые команды. Если вам нужны более подробные инструкции о том, как читать конфигурацию из файла и использовать его в задании cron, я думаю, что это действительно относится к другому вопросу. – janos

0

Создание нулевого разделенным список (Filename Month_Day.tar) пар и использовать xargs для добавления каждого файла в соответствующий архив:

find . -maxdepth 1 -mindepth 1 -type f -printf "%Tb%Td.tar\0%f\0"|xargs -n 2 -0 tar uf