あるディレクトリの中のディレクトリ群を、全て個別のzipアーカイブにしたいと思った。
そこで
for i in `ls`; do zip -r $i.zip $i; done;
というコードを書いて実行したところ、すべてのディレクトリの中に「.zip」というファイルが出来上がってしまった。
いやいや、もう一つ上のディレクトリに、個別のディレクトリと個別のディレクトリのzipアーカイブが並んでほしかったのだけど。
何がおかしいのだろうと思って
for i in `ls` ; echo $i.zip
を実行したところ
dir1/.zip
dir2/.zip
という結果が出てきた。
つまり、ディレクトリをあらわす記号”/”の後に.zipがついていたわけです。
なるほど、自分のzshはディレクトリの名前をタイプするだけでそのディレクトリの中に入るような仕様にカスタムしているので、
cd dir1
をしていることと同様になり、その後.zipを作っているということになっていたわけです。
ということでディレクトリの末尾のスラッシュを消す方法を探したところ、以下のコマンドで達成できました。
for i in `ls` ; echo ${i%/}.zip
${i%/} %/を変数に対して付加してあげると、末尾のスラッシュを取り除いてくれるようです。
これは例えばスラッシュでなくても、i%#とすれば末尾のシャープを取り除いてくれるようですね。
結果、以下のコードを実行することで思っていたことが出来ました。
for i in `ls` ; do zip -r ${i%/}.zip $i; done;
勉強になりました。
2020年6月4日 追記
ちなみに、こんな複雑な方法じゃなくて他になにかないのかと思って試してみたところ、MacOS10.15.5の環境で
find . -depth 1 | xargs -I@ zip -r @.zip @
でもうまく行きました。
こっちがシンプルでいいですね。
ちなみにLinux環境だと
find . -maxdepth 1 | xargs -I@ zip -r @.zip @
で行けました。
-d 1と指定すると -depthを使えって言われるのですが、
find . -depth 1
とすると ‘paths mus precede expression 1’ と怒られます。
おそらくバグっぽいですが、これは-depthを-maxdepthとすると回避できました。
この記事へのコメントはありません。