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"
)

答え2

私はzshユーザーではありませんが、以下はbashで動作しますが、そうではありません。考える特定の bashism と連携して動作するため、次のように作業を行う必要があります。

coolerzip() { cd "${1%/*}" && zip -r "${1##*/}" "${1##*/}" && cd -; }

$1参照するスクリプトまたは関数の位置パラメータ。最初コマンドラインでスクリプトまたは関数に提供される引数。スクリプトまたは関数名(0番目の引数)を指定し、$20番目の引数を除く各引数を指定し、引数の数(0番目の引数パラメータを除く)も指定します。コマンドライン(またはすべてのシェル)から呼び出すと状況が異なりますが、ここではこれについて議論しません。$9$0$@$#sh -c

${1%/*}$1削除されたglobパターンの中で最も短い一致値を返します*/(必要に応じて)。最長最後に一致した場合は%%)を使用してください。これにより、関数に提供したパスの最後の部分が削除されます。パターンの先頭から最も長い一致を${1##*/}削除します(開始部分で最も短い一致の場合は1つ使用)。*/$1#

上記の関数は少し脆弱です。~/folder1/folder2/引数に末尾のスラッシュ(たとえば)がある場合は中断されます。引数がスラッシュのない単一のディレクトリ名の場合は、別々に区切ります。この問題を解決する簡単な方法は、readlinkコマンドを使用して入力引数のフルパスを返すことです(少なくとも私のUbuntuシステムでは末尾のスラッシュも削除します)。

coolerzip() { a="$(readlink -f "$1")"; cd "${a%/*}" && zip -r "${a##*/}" "${a##*/}" && cd -; }

関連情報