X



トップページLinux
191コメント59KB

Bashでプログラミング [転載禁止]©2ch.net

0175login:Penguin
垢版 |
2020/01/09(木) 15:44:04.89ID:2gXyzp52
>>174
詳しいアドバイスありがとうございます!
本当に目から鱗です。

レスを見て2分で解決しました。
bashで力技で何時間も悪戦苦闘していたのが
悲しくなるくらい呆気なさでした。

本当に的確なアドバイスありがとうございます!
0176login:Penguin
垢版 |
2020/02/09(日) 12:27:07.05ID:TdA6OoR0
やってることが複雑になったと感じたら、最初に戻って考え直すことだ。
0177login:Penguin
垢版 |
2020/09/12(土) 14:17:52.81ID:uRW97DpA
バッシュの教科書って本買おうとしたけど、どこでも売り切れてて人気みたい
0178login:Penguin
垢版 |
2020/09/12(土) 15:05:18.55ID:f1Nswvqc
売れなかったから廃盤になるんやで
0179login:Penguin
垢版 |
2021/05/27(木) 01:02:31.31ID:m06R9ufF
こういったケースの空白文字がある場合のワンライナーはどう書けばいいですか??

・特定のディレクトリの中にある大量のファイル
・ファイルは全て同じ拡張子(.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
```
0180login:Penguin
垢版 |
2021/05/27(木) 12:15:42.12ID:+SArHOBh
慣れてる人ならともかくリネームとかいう取り返しのつかない作業を
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"

みたいなシェルスクリプトを生成して実行する
実行前に目視で確認できるし、場合によっては手動で修正すればいいし
0181login:Penguin
垢版 |
2021/05/27(木) 13:40:55.77ID:EyeK5jGy
そもそもファイル名に空白が入ってなければ正しく動くのか?

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/'
とするのが手っ取り早いと思う。
でもいきなりこんなことはしたくないね。
少なくともファイル名の衝突くらいはチェックしないと。
0182login:Penguin
垢版 |
2021/05/28(金) 15:39:24.70ID:RtkQ3VQL
どこに空白が入っているの?

例示して
0183login:Penguin
垢版 |
2021/06/04(金) 21:38:34.04ID:i0A1vKtk
空白入るなら、ダブルクォートをエスケープして入れてやればいい、と。

そもそも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
0184login:Penguin
垢版 |
2021/11/11(木) 18:26:58.40ID:wR3FRIZb
(´-`).。oO(>>1 は、いなくなったか…)
0185login:Penguin
垢版 |
2022/01/11(火) 19:24:30.28ID:JlzCBGqO
if文で文字列を正規表現にマッチしたら抽出、という処理を作りたいのですが、
マッチしたら一つ目の文字列は抽出出来ましたが、二つ目以降マッチしたものが抽出できません
どうコードを書けば良いのでしょうか
0186login:Penguin
垢版 |
2022/01/12(水) 22:51:42.05ID:uKLEW53q
[[ foo-bar =~ (foo)-(bar) ]] && echo ${BASH_REMATCH[2]}
的な?
0にマッチ全体、カッコでグループ化すればn番目の部分マッチが1以降に入る
barが出るはず
0187login:Penguin
垢版 |
2022/01/12(水) 23:04:58.17ID:uKLEW53q
推測だけど、一つ目のマッチだけ見えているんじゃなく、全体のマッチだけ見えてるんじゃないか?
配列変数を添字なしで参照すると0番目の要素が返る、よくある罠

$BASH_REMATCH
= ${BASH_REMATCH[0]}
= foo-bar

違ったらすまん
0188login:Penguin
垢版 |
2022/06/20(月) 21:01:15.77ID:y2PJqfx1
nnn=111;mmm=0;echo $nnn | read mmm;echo $mmm
0
なんで?
0189login:Penguin
垢版 |
2022/06/29(水) 00:20:30.34ID:X2h/MJK6
昔からあるバグです
0190login:Penguin
垢版 |
2024/02/24(土) 13:44:13.05ID:NO8gqPUT
UIDとEUID を食い違いさせる方法って どんなのがありますか?
レスを投稿する


ニューススポーツなんでも実況