
現在、次の問題で苦労しています。
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
)のアーカイブ検索。unzip
unzip