Unzip は xargs による入力を拒否します。

Unzip は xargs による入力を拒否します。

現在、次の問題で苦労しています。

macOSでbashシェルを使用して、名前に固定部分と可変部分を含むzipファイル(固定部分は「satori-export」)をダウンロードディレクトリから検索し、ファイルを解凍したいと思います。完全な*nix初心者として、私はCLIを使用してこれを達成する方法を見つけました。 (醜い、非効率的、または誤ったコマンドラインの使用により涙が出ていることを事前にお詫び申し上げます。)

ls ~/Downloads | grep "satori-export" | sed 's/^/~\/Downloads\//' | xargs unzip

または代替的に

ls ~/Downloads | grep "satori-export" | sed 's/^/~\/Downloads\//' | xargs -I "archive" unzip "archive"

ただし、これらのコマンドを実行すると、次のような結果が出力されます。

unzip: cannot find or open ~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip, ~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip.zip or ~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip.ZIP.

奇妙なことは、ファイル自体を直接入力として使用してunzipコマンドを直接実行するとき(見てわかるように、上記の解凍失敗メッセージで最初に参照されたファイル名とまったく同じパスと名前を使用する)、次のことを使用することです。

unzip ~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip

苦情や問題なく、unzipを介してファイルのアーカイブが解放され続けます。これにより、パイプラインコマンドチェーンに解凍エラーが表示される理由が少し混乱します。

ベストアンサー1

問題はxargs拡張されないことです~。コマンドラインからコマンドを実行すると、シェルはこれを行いますが、パイプラインには役立ちません。したがって、unzip名前付きファイル~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zipまたはエラーメッセージに表示されるバリアントのいずれかを見つけると、インクルードディレクトリは~もちろん、現在のディレクトリに指定されているディレクトリもないためDownloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip失敗します。

これは働きます:

find ~/Downloads -maxdepth 1 -name "*satori-export*" -exec unzip {} \;

~/Downloadsこれは、nameに含まれるすべてのファイルを検索し、一度に1つずつ実行します(引数の最初のファイル名のみを処理するアーカイブ名と見なされ、残りはファイル名として解釈されるため、ここで重要ですsatori-export)のアーカイブ検索。unzipunzip

おすすめ記事