bash

シェルでディレクトリの後につく/(スラッシュ)を消す方法

あるディレクトリの中のディレクトリ群を、全て個別の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とすると回避できました。

macにvagrant2.0.3をインストールしたらpluginがインストールできなくて困った話前のページ

socket.ioの実装テスト次のページ

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

最近の記事

Twitter

PAGE TOP