次のスクリプトがあります。
#!/bin/sh
#Finds all folders and subsequent files that were modified yesterday and dumps them out to a text
updatedb && rm /tmp/*
echo $(locate -b `date --date='yesterday' '+%Y.%m.%d'`) > /tmp/files.txt
#creates variable out of the file.
input="/tmp/files.txt"
yest=$(date --date='yesterday' '+%Y.%m.%d')
#loops through each entry of folders
while IFS= read -r folders
do
echo $folders
tar -cvf $folders\.tar $folders --remove-files
done < "$input"
エラーが発生します。
tar: /backup/DNS/intns1/2016.07.19: Cannot open: Is a directory
tar: Error is not recoverable: exiting now
私が間違っていることを見つけようとしています...
ベストアンサー1
date
find
、tar
および以下を使用する最新のGNUバージョンxargs
:
このスクリプトには、bash、ksh、zsh、または以下を理解する他の合理的に近代的なシェルが必要です。プロセスの交換( <(...)
)
#!/bin/bash
today='12am today'
yesterday='12am yesterday'
# function to create a tar file for a directory but only include
# files older than "$2" but newer than "$3". Delete any files
# added to the tar archive.
#
# the tar file will be created uncompressed in the same directory
# as the directory itself. e.g. ./dir --> ./dir.tar
function tarit() {
dir="$1"
older="$2"
newer="$3"
tar cvf "$dir.tar" -C "$dir/.." --null --remove-files \
-T <(find "$dir" ! -newermt "$older" -newermt "$newer" -type f -print0)
}
# we need to export the function so we can
# run it in a bash subshell from xargs
export -f tarit
# we want to find newer files but output only the path(s)
# containing them with NULs as path separator rather than
# newlines, so use `-printf '%h\0'`.
find . ! -newermt "$today" -newermt "$yesterday" -type f -printf '%h\0' |
sort -u -z | # unique sort the directory list
xargs -0r -I {} bash -c "tarit \"{}\" \"$today\" \"$yesterday\""
安全のためにすべての変数がどのように引用されるか(bashサブシェル内でもエスケープ引用符内でも)、NULが区切り文字として使用される方法に注意してください(パス名および/またはファイル名に迷惑ですが完全に有効なファイル名が含まれている場合)スクリプトは中断されません)。スペースや改行などの文字)。また、読みやすくするためにインデントと余分なスペースを使用することに注意してください。そして、コメントを使用して、現在進行中の作業と理由を説明してください。
ディレクトリ全体を圧縮し、ディレクトリ自体(およびその中のすべてのファイル)を削除したい場合は簡単です。
#!/bin/bash
today='12am today'
yesterday='12am yesterday'
find . ! -newermt "$today" -newermt "$yesterday" -type f -printf '%h\0' |
sort -u -z |
xargs -0r -I {} tar cfv "{}.tar" "{}" -C "{}/.." --remove-files
個人的には、これらのスクリプトを使用することは非常に危険だと思います。注意しない場合(たとえば、検索パスの/
代わりにルートとして実行したり、ディレクトリから実行している場合)、オペレーティングシステムに必要なファイルまたはディレクトリ全体を削除することもできます。ホームディレクトリ(または書き込み権限を持つすべての場所 - とにかくtarファイルを作成する必要があります)のuidで実行しても、アーカイブしたいファイルが削除されることがあります。.
/
私はあなたを考える本物--remove-files
必ずオプションを使用する必要があるかどうか考え直す必要がありますtar
。何を達成したいですか?これは一種のtmpreaperですか?その場合、その中のファイルを盲目的に削除すると、/tmp
昨日 /tmp に生成され、今日や明日の再利用が必要なファイルなどの長期実行プロセスが中断される可能性があります。
簡単に言うと:これは装填された散弾銃のカップルです。彼らと一緒に足に銃を撃たないでください。