アーカイブ時に空のファイルと隠しファイルを除外する

アーカイブ時に空のファイルと隠しファイルを除外する

ディレクトリのアーカイブを作成する必要がありますtar シェルスクリプトでただし、隠しファイルやサイズが に等しいファイルも除外する必要があります0。また、最初のコマンドライン引数は作成されるアーカイブの場所、2 番目はアーカイブの名前、3 番目はアーカイブされるファイルがあるディレクトリへのパスです。

ターミナルで次のように引数を送信してみました:

/bin/bash ss1 /home/user arch /home/user/folder

しかし、tar エラーが発生します。次のようにアーカイブしようとしました:

tar -cvf --exclude=.* $1/$2 $3 

しかし、それは正しくなく、これに対する正しい構文が何であるか、また空のファイルや隠しファイルを除外する方法がわかりません。

答え1

これをタグ付けしたので、 GNUと GNU をlinuxお持ちであると想定します。findtar

ファイル名に改行文字が埋め込まれておらず、空のディレクトリをアーカイブしたくない場合は、次のようにします。

find "$3" -type f \! -empty \! -name '.*' | tar cvf "$1/$2" -T -

find関連するファイルを検索し、アーカイブするファイルのリストを読み取るように-T -指示します。tarstdin

これを改良して、空のディレクトリを含める場合は次のようにします。

find "$3" \( -type d -empty \) -o \( -type f \! -empty \! -name '.*' \) | \
    tar cvf "$1/$2" -T -

そしてもしあなたがまた改行が埋め込まれたファイル名を処理したい:

find "$3" \( \( -type d -empty \) -o \( -type f \! -empty \! -name '.*' \) \) -print0 | \
    tar cvf "$1/$2" --null -T -

答え2

これを試して:

find test/ -not -iname ".*" -not -empty -exec tar --no-recursion -rvf file.tar {} \;

唯一の問題は、空のディレクトリが含まれないことですが、どこかに回避策があると思います...

関連情報