Bashでプログラミング [転載禁止]©2ch.net
「LIKE」句を使って、テーブル名で絞り込む。
最後に「meta」で終わるテーブルだけを表示したい
mysql> SHOW TABLES FORM wordpress LIKE "%meta";
「mysql show tables」で検索! >>170, 171, 172
レスが遅くなって申し訳ありません。
CMSのインストール・削除のトライアンドエラーを
繰り返しているうちにテーブルが増えてきてしまった次第です。
やりたいことは、たくさんあるテーブルの中から
特定の接頭辞が付くテーブルだけを検索し削除したいです。
`drop table from 〇〇`でググるとかなりの割合の方が
bashでmysqlのコマンドを書いて力技で削除しているようでした。
当方もそれに習って色々試したのですが、
うまく動作せずに困っておりました。
こういった場合の無駄なくシンプルに削除するに
適切なコマンドはどうしたらよいのでしょうか? なんでわざわざ手間がかかることするかね?自動化したいんじゃないだろ?
>>172みたいに該当するテーブル一覧でもだして、テキストエディタでも使って
drop table from table1
drop table from table2
drop table from table3
とかいうSQL作って、それを実行すりゃいいやん
シンプルにしたいんだろ?なんでわざわざxargsとか使って複雑なものを作ろうとしてるんだ
自動化したいなら↑の内容を一つづつ自動化しろ。いっぺんにやろうとすんなよ。
1. テーブル一覧を、drop table from ○○にしやすいようにテーブル名のみの出力にしろ
2. テーブル名のリストをdrop table from ○○のリストに変換するスクリプトを作れ
3. そのスクリプトの出力をmysqlコマンドに流せ
これだけだろ
> ググるとかなりの割合の方が
ググるとかなりの割合の方が馬鹿なだけ >>174
詳しいアドバイスありがとうございます!
本当に目から鱗です。
レスを見て2分で解決しました。
bashで力技で何時間も悪戦苦闘していたのが
悲しくなるくらい呆気なさでした。
本当に的確なアドバイスありがとうございます! やってることが複雑になったと感じたら、最初に戻って考え直すことだ。 バッシュの教科書って本買おうとしたけど、どこでも売り切れてて人気みたい こういったケースの空白文字がある場合のワンライナーはどう書けばいいですか??
・特定のディレクトリの中にある大量のファイル
・ファイルは全て同じ拡張子(.mp3)
・拡張子の直前にランダムのID何文字か付いている(例 -48antiO81n5Dq)
・全てのIDを取り除きリネームしたい
自分で作成したのですが最後のmvで躓いています。。
空白文字があるとそこでファイル名を分割されてうまく動作しません。
```bash
find . -type f -name "*.mp3"|grep "\-[a-zA-Z0-9-]*.mp3$"|sed "s/\-[a-zA-Z0-9-]*.mp3$/.mp3/"|xargs -n2 mv
``` 慣れてる人ならともかくリネームとかいう取り返しのつかない作業を
findとxargsでやりたくないな
俺ならリスト生成してmvするわ
mv "aaa aaa-48antiO81n5Dq.mp3" "aaa aaa.mp3"
mv "bbb bbb-48antiO81n5Dq.mp3" "bbb bbb.mp3"
mv "ccc ccc-48antiO81n5Dq.mp3" "ccc ccc.mp3"
みたいなシェルスクリプトを生成して実行する
実行前に目視で確認できるし、場合によっては手動で修正すればいいし そもそもファイル名に空白が入ってなければ正しく動くのか?
aaa-48antiO81n5Dq.mp3
bbb-48antiO81n5Dq.mp3
というファイルがあったら sed の出力は
aaa.mp3
bbb.mp3
となるように思うのだが。いろいろつっこみたいが、とりあえず
find . -type f | xargs -d '\n' rename 's/-[a-zA-Z0-9-]*\.mp3$/.mp3/'
とするのが手っ取り早いと思う。
でもいきなりこんなことはしたくないね。
少なくともファイル名の衝突くらいはチェックしないと。 空白入るなら、ダブルクォートをエスケープして入れてやればいい、と。
そもそもxargs使わんといけんの?
ふつうにこんなんじゃだめか?
find . -type f -name "*.mp3"|grep "\-[a-zA-Z0-9-]*.mp3$" \
| while read i;do \
echo mv -v \"$i\" \"`echo $i|sed '"s/\-[a-zA-Z0-9-]*.mp3$/.mp3/'`\"; \
done
で、そもそもfind使うなら、-nameじゃなくて-regex使った方がよくない?
grepはそのためだよな?(ってまあ、俺もgrep使うような気がするけどw)
で、さらにfind使うなら、xargsよりは-execの方がベターだ。
で、そうすっとこれが多分模範回答
find . -type f -regex "\./\-[a-zA-Z0-9-]*.mp3$" \
-exec echo mv -v \"{}\" \"`echo {}|sed 's/\-[a-zA-Z0-9-]*.mp3$/.mp3/'`\" \;
で、いずれもmvの前にechoを入れてるので、よさげだったら、echoを削って祈ってw (´-`).。oO(>>1 は、いなくなったか…) if文で文字列を正規表現にマッチしたら抽出、という処理を作りたいのですが、
マッチしたら一つ目の文字列は抽出出来ましたが、二つ目以降マッチしたものが抽出できません
どうコードを書けば良いのでしょうか [[ foo-bar =~ (foo)-(bar) ]] && echo ${BASH_REMATCH[2]}
的な?
0にマッチ全体、カッコでグループ化すればn番目の部分マッチが1以降に入る
barが出るはず 推測だけど、一つ目のマッチだけ見えているんじゃなく、全体のマッチだけ見えてるんじゃないか?
配列変数を添字なしで参照すると0番目の要素が返る、よくある罠
$BASH_REMATCH
= ${BASH_REMATCH[0]}
= foo-bar
違ったらすまん nnn=111;mmm=0;echo $nnn | read mmm;echo $mmm
0
なんで? UIDとEUID を食い違いさせる方法って どんなのがありますか?