Zipフォルダにはフォルダパスは含まれておらず、パラメータは1つだけ必要です。

Zipフォルダにはフォルダパスは含まれておらず、パラメータは1つだけ必要です。

ファイルまたはフォルダを圧縮するときに通常実行するすべての手順を実行するzip機能を作成しようとしています。私の現在のディレクトリがあり、名前付き~フォルダを圧縮し、Folder1そのファイルパスを~/Folder2/Folder1

発行された

cd ~/Folder2 && zip -r Folder1 Folder1 && cd -

まさに私が望んでいたものです。つまり、出力にFolder1.zip圧縮されているフォルダ(たとえば)にリンクされているフォルダが含まれないように圧縮し、再帰的に圧縮し、圧縮したい/home/user/Folder2ファイルと同じ名前で圧縮する最初の引数を受け入れます。またはフォルダの名前はまったく同じです。ジッパー( Folder1.zip)。

.zshrcだから私は私のものに次のようなものを作りたいと思います。

coolerzip() { cd /path/to/file && zip -r file file && cd - }

1つのパラメータを許可するだけです。この場合は~/Folder2/Folder1。その後、Folder12つのsの名前になり、圧縮する前に現在のディレクトリのsoに直接移動します。 3つではなく1つのパラメータしか必要としないようにこれを達成する方法はありますか?filecoolerzipcd~/Folder2Folder1coolerzip

ベストアンサー1

この関数のパラメータはです$1

あなたはそれを使用することができます歴史拡張修飾子ディレクトリ部分とパスの最後のコンポーネントを抽出します。引数があればisとis~/directory2/directory1です。 (記憶法:ead and ail。)$1:h~/directory2$1:tdirectory1ht

関数本体の周囲に中かっこの代わりにかっこを使用します。このように、関数本体はサブシェル(別々のシェルプロセス)で実行され、変数の割り当て、ディレクトリの変更などはサブシェルにのみ影響します。

coolerzip () (
    cd $1:h &&
    zip -r $2:h.zip $2:h
)

他のシェルには履歴拡張修飾子がないため、引数を解析するには別のものが必要です。ファイル名の場合は、先行する${1##*/}すべてのディレクトリコンポーネントを削除します。ただし、この方法は引数に末尾のスラッシュがある場合は機能しませんが、"$(basename -- "$1")"この場合は機能します。デフォルトディレクトリの場合を使用してください$(dirname -- "$1")。 zsh以外のシェルでは、次のものが必要です。変数置換の周りに二重引用符を追加する

coolerzip () (
    name="$(basename -- "$1")"
    cd "$(dirname -- "$1")" &&
    zip -r "$name.zip" "$name"
)

おすすめ記事