ファイルまたはフォルダを圧縮するときに通常実行するすべての手順を実行する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
。その後、Folder1
2つのsの名前になり、圧縮する前に現在のディレクトリのsoに直接移動します。 3つではなく1つのパラメータしか必要としないようにこれを達成する方法はありますか?file
coolerzip
cd
~/Folder2
Folder1
coolerzip
ベストアンサー1
この関数のパラメータはです$1
。
あなたはそれを使用することができます歴史拡張修飾子ディレクトリ部分とパスの最後のコンポーネントを抽出します。引数があればisとis~/directory2/directory1
です。 (記憶法:ead and ail。)$1:h
~/directory2
$1:t
directory1
h
t
関数本体の周囲に中かっこの代わりにかっこを使用します。このように、関数本体はサブシェル(別々のシェルプロセス)で実行され、変数の割り当て、ディレクトリの変更などはサブシェルにのみ影響します。
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"
)