TARファイル:サブディレクトリからデフォルトディレクトリにファイルを移動する

TARファイル:サブディレクトリからデフォルトディレクトリにファイルを移動する

私はこのコードを使用しようとしました。

find documents -maxdepth 1 -type f -print0 | xargs -0 tar cvf documents.tar.gz

カタログ文書のバックアップを作成します。

このディレクトリの構造は次のとおりです。

ここに画像の説明を入力してください。

単一のディレクトリであるfiles/に保存したいと思います。

ここに画像の説明を入力してください。

しかし、私はそうしませんでした。どうすればいいですか?ありがとう

答え1

tarの代わりに別のディレクトリにハードリンクできます。

# find all files in directory named directory
find directory -type f | \
while read f;
do
    f2=`echo "$f"|sed -e 's/\//:/g'`  # replace / with :
    ln "$f" "directory2/$f2"  # create hardlinks in directory2/
done

これにより、次のリンクが生成されます。

directory/file1 => directory2/directory:file1
directory/file2 => directory2/directory:file2
directory/folder1/file3 => directory2/directory:folder1:file3
directory/folder1/file4 => directory2/directory:folder1:file4
directory/folder2/file5 => directory2/directory:folder2:file5
directory/folder3/folder4/file6 => directory2/directory:folder3:folder4:file6
directory/folder3/folder4/file7 => directory2/directory:folder3:folder4:file7

答え2

私が望む方法は、バックアップソースとして新しいディレクトリを作成し、ハードリンクで埋めることです。バックアップしたいディレクトリツリー全体が同じボリュームにあることを願っています。

> pwd
/path/to/documents
> cd /path/to/
> mkdir tar-documents
> mkdir tar-documents/documents
> ln /path/to/documents/file1
> ln /path/to/documents/file2
> ln /path/to/documents/folder1/file3 folder1:file3
[...]

ファイルの数が多い場合は、スクリプトを介して実行する必要があります。

その後、tarこのディレクトリで実行します。

> cd /path/to/tar-documents
> tar cvzf /backup/path/documents.tar.gz documents

最後にディレクトリを削除するとtar便利です。

答え3

これを試してみてください。

*tar現在のフォルダからすべてのファイルを見つけ、フォルダまたは目的のMainDirectory場所にコピーします。

find . -iname "*tar*" -exec cp {} ~/MainDirectory/ \;

答え4

まず、ディレクトリをアーカイブする場合、アーカイブに同じファイル構造を持つことが適切なスナップショットを作成するのに最適な方法です。あなたが要求するのは、親ディレクトリ、コロン、ファイル名を含むようにファイル名を変更することです。しかし、私にとって奇妙なことは、これが文脈から外れたことです。私は--transformこのオプションを使ってかなり近づいています。

 --transform=EXPRESSION, --xform=EXPRESSION
                         use sed replace EXPRESSION to transform file

例を以下に説明する。このスタック交換の回答 (これではありませんが、参考にしてください。正しいsed文法)。コマンドを使用すると、--transform次のようになります。

tar czvf documents.tar.gz --transform 's/\//:/g' documents

残念ながら、これはサブディレクトリをアーカイブに保持するため、目的の効果は得られませんが、サブディレクトリは空であり、ファイルは最初の親ディレクトリではなくアーカイブのルートにあります。

オプションを使用するソリューションがあると思います-C, --directoryが、それは動的ではなく、新しいファイル名でファイルのディレクトリ名を保持するのには適していません。

私が見つけた解決策は、あなたが持っているソリューションと変換コマンドの使用を混在させることです。

find documents -type f -print0 | xargs -0 tar czvf test.tar.gz --no-recursion --transform 's/\//:/g' --transform 's:\::/:1' documents/

また、あなたの質問にファイル名を拡張子として指定しましたが、.gzその-z, --gzipオプションはありません。

これが役に立つことを願っています、
アレックス

関連情報