web-dev-qa-db-ja.com

変更日に基づいてファイルを圧縮したい

複数のパスを含むファイル(Paths.dat)。15日前のファイルを検索し、変更された日付で同じフォルダに圧縮する必要があります。

Paths.dat:-ファイルシステムに複数のパスが含まれます(区切り文字 '|'を使用)

/docusr1/user01 | /docusr2/user02 | /home/user01

例:-/ docusr1/user01

-rwxrwxrwx. 1 docusr2 docusr2     0 Mar 30 10:52 vinay.txt
-rw-rw-r--. 1 docusr2 docusr2     0 Mar 30 10:52 sathish.txt
-rw-rw-r--. 1 docusr2 docusr2   625 Apr  2 10:57 demo1.xml
-rw-rw-r--. 1 docusr2 docusr2  4430 Apr  2 11:09 sample.xml
-rw-rw-r--. 1 docusr2 docusr2    48 Apr  2 14:04 20180402140454.log
-rw-rw-r--. 1 docusr2 docusr2    48 Apr  2 14:39 20180402143917.log
-rw-rw-r--. 1 docusr2 docusr2    39 Apr  2 14:41 20180402144159.log
-rw-rw-r--. 1 docusr2 docusr2    84 Apr  2 14:46 20180402144651.log
-rw-rw-r--. 1 docusr2 docusr2   279 Apr  2 14:48 archive.sh
-rw-rw-r--. 1 docusr2 docusr2    84 Apr  2 14:48 20180402144814.log
-rw-rw-r--. 1 docusr2 docusr2  1228 Apr  5 10:10 real.xml

15日経過したファイルを検索し、変更された日付をZipファイル名(アーカイブファイル)としてZipする必要があるファイル

予想されるo/p:-

20170330.Zip  -> it should contain all file which are modified on 2017-03-30
20170402.Zip
20170405.Zip
2
Vinay Gowda
_find . -maxdepth 1 -mtime +15 -type f -printf "%TY%Tm%Td %p\n" | while read date name ; do Zip $date $name; done
_

Ymd形式のファイルの最終変更時刻

ディレクトリの下のすべてに対してそれを行うには、さまざまな方法があります。いくつかの例を挙げて、絶対パスを使用してください。たとえば、_"/home/user"_を使用します。

_find /home/user -type d -print0 | while read -d '' -r dir; do cd "$dir" && pwd && find . -maxdepth 1 -mtime +15 -type f -printf "%TY%Tm%Td %p\n" | while read date name ; do Zip $date $name; done; done
_

または

_find /home/user -type d -print0 | xargs -0 -I {} sh -c 'cd '\"{}\"' && pwd && find . -maxdepth 1 -mtime +15 -type f -printf "%TY%Tm%Td %p\n" | while read date name ; do Zip $date $name; done'
_
1
Bharat

以下を試すことができます。

while read zipfile files; do 
    Zip ${zipfile}.Zip $files
done <<< $(find -maxdepth 1 -type f | xargs stat -c "%y,%n" | awk -F, '{a[substr($1,1,10)]=a[substr($1,1,10)] " " $2} END{for(i in a){print i a[i]}}')

whileループは、次の形式の文字列を想定しています。

zipfilename file1 file2 file3 ...

これは

  • 現在のディレクトリのすべての通常ファイルを取得:find -maxdepth 1 -type f
  • statを使用して変更時刻を確認する
  • awkを使用して結果をフォーマットし、その日に変更されたすべてのファイルが1行で表示されるようにします
1
oliv