シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
探検
シェルスクリプト総合 その32
■ このスレッドは過去ログ倉庫に格納されています
2019/10/25(金) 00:08:45.53ID:6btPTvif
2019/10/31(木) 19:36:28.51ID:pBbgzdOe
>>55
サンクス(´・ω・`)
サンクス(´・ω・`)
2019/11/06(水) 17:06:15.24ID:4kXKpMLv
aliasってxargsじゃ使えないけど使えたらまずいんだろうか
関数ならexportすればできるけどさ
関数ならexportすればできるけどさ
58デフォルトの名無しさん
2019/11/06(水) 19:12:11.78ID:wTTuQQRz >>57
まずいとかいうわけじゃなくて、xargsは外部コマンドだよ。
例えば、俺がC言語であるプログラムを作ったとする。
俺のプログラムから、親プロセス(シェル)がなにかもわからないのに、
そのシェルで定義したメモリ内部のものを呼び出せるわけがない
まずいとかいうわけじゃなくて、xargsは外部コマンドだよ。
例えば、俺がC言語であるプログラムを作ったとする。
俺のプログラムから、親プロセス(シェル)がなにかもわからないのに、
そのシェルで定義したメモリ内部のものを呼び出せるわけがない
59デフォルトの名無しさん
2019/11/06(水) 19:12:36.64ID:wTTuQQRz 関数も無理やろ?
2019/11/06(水) 19:20:58.71ID:wTTuQQRz
たたbashに関数をexportできる機能があるってのは不思議なんだよなw
まあなんか変なことしてるんだろう。で気にしてなかったけどさ、
少し試してみたら、bashからbashを起動したときには使えるが、
zshだと使えないし、bash→dash→bashの流れでも使えない。
どういう仕組なんだろう?
まあなんか変なことしてるんだろう。で気にしてなかったけどさ、
少し試してみたら、bashからbashを起動したときには使えるが、
zshだと使えないし、bash→dash→bashの流れでも使えない。
どういう仕組なんだろう?
2019/11/06(水) 19:34:34.77ID:OvjaMqE0
echo 'Hello World' | xargs -I@ bash -c $'shopt -s expand_aliases;alias p="echo";\n p @'
2019/11/07(木) 00:18:43.96ID:dfqCliYv
func(){ echo $@;}
export -f func
echo foo | xargs func
xargs: func: そのようなファイルやディレクトリはありません
echo foo | xargs -I@ bash -c 'echo @'
foo
関数ならこうだな
xargsでaliasはbashだと無理だからtcshでやれってstack overflowで見た
export -f func
echo foo | xargs func
xargs: func: そのようなファイルやディレクトリはありません
echo foo | xargs -I@ bash -c 'echo @'
foo
関数ならこうだな
xargsでaliasはbashだと無理だからtcshでやれってstack overflowで見た
2019/11/07(木) 08:59:49.28ID:C0Y8MuYI
macては動かないのでwindows使ってくださいみたいな暴論
2019/11/07(木) 11:05:05.20ID:cfhO2vSD
>>60
export -f は環境変数に
BASH_FUNC_関数名%%=関数を文字列
を設定してるだけだからじゃね。bashは起動時に環境変数にそゆのがあったら関数とし展開するから使える、その他はそんな環境変数知らんから単なる環境変数のままな感じな
dashは起動すると、その環境変数が引き継がれないからそこで断ち切られる感じかな
関数にしろaliasにしろサブプロセスに引き継ぐという考え自体がイレギュラーな感じだな
export -f は環境変数に
BASH_FUNC_関数名%%=関数を文字列
を設定してるだけだからじゃね。bashは起動時に環境変数にそゆのがあったら関数とし展開するから使える、その他はそんな環境変数知らんから単なる環境変数のままな感じな
dashは起動すると、その環境変数が引き継がれないからそこで断ち切られる感じかな
関数にしろaliasにしろサブプロセスに引き継ぐという考え自体がイレギュラーな感じだな
2019/11/07(木) 11:11:30.53ID:sEmiRyTj
>>64
やっぱり環境変数経由なのか?
でもちゃんと確認したんだけどなw
まさかbash以外の外部コマンドを実行するときに削除してるとか?
そしてbashの中からexport -pとかしたときは省いてるとか?
やっぱり環境変数経由なのか?
でもちゃんと確認したんだけどなw
まさかbash以外の外部コマンドを実行するときに削除してるとか?
そしてbashの中からexport -pとかしたときは省いてるとか?
2019/11/07(木) 11:19:16.71ID:cfhO2vSD
2019/11/07(木) 11:26:10.68ID:mwfKyddL
なんかもろにそれっぽいのがあった。dashは一般的でないような名前のは削除するらしい
https://unix.stackexchange.com/questions/498905/why-is-my-bash-func-foobar-environment-variable-unset-in-shell-subprocesses
https://unix.stackexchange.com/questions/498905/why-is-my-bash-func-foobar-environment-variable-unset-in-shell-subprocesses
2019/11/07(木) 11:52:29.35ID:sEmiRyTj
ようやく見れたw
envで見れるね。export使ってた。
envで見れるね。export使ってた。
2019/11/07(木) 11:53:35.24ID:sEmiRyTj
この変数使えば、なにか面白いことできそう。
ってか、xargsの引数にできないか?
ってか、xargsの引数にできないか?
2019/11/07(木) 11:54:11.02ID:sEmiRyTj
bashを介せば
2019/11/08(金) 00:07:00.88ID:jWGBsuvq
alias xargs='xargs '
echo *txt | xargs ll
.basurcの登録分はこれでもいける
echo *txt | xargs ll
.basurcの登録分はこれでもいける
2019/11/14(木) 12:41:11.56ID:RaS+/sOM
uucpとかって今時どういう活用法あるかな?
2019/11/14(木) 12:59:55.09ID:GaAZ8ORG
TrailBlazer でも手に入れたのか
74デフォルトの名無しさん
2019/11/27(水) 15:42:28.61ID:JZevxkSS kill とtrapでソフトタイマ作ってみた。需要あるかな
2019/11/27(水) 16:34:50.24ID:KOWJoLHR
sleepと何が違うん?
76デフォルトの名無しさん
2019/11/27(水) 18:43:12.26ID:9SXmP3sk SECONDSとの比較だからずれの蓄積がない。
平行処理が出来る。
平行処理が出来る。
2019/11/27(水) 18:48:52.87ID:KOWJoLHR
ずれの蓄積に関しては、sleepでも補正していけばなんとかなるので。
並行処理はまあそうだね。需要あるんじゃない?
コード見てなにかに使えそうなら使うかも
どこまで作り込んでるのかしらないが
並行処理はまあそうだね。需要あるんじゃない?
コード見てなにかに使えそうなら使うかも
どこまで作り込んでるのかしらないが
78デフォルトの名無しさん
2019/11/28(木) 06:15:51.80ID:f/6vs/+B シグナル発生をバックグランドで動かしシェルスクリプトのプロセスに送るのがかなめ。
2019/11/28(木) 07:03:59.17ID:uZo2jF8i
うん。それはわかるw
前に条件を満たすまで無限ループ+タイムアウト機能ってのを実装したことがあるから
結局複雑な割にタイムアウトすることはまず無いので廃止したけどさ
前に条件を満たすまで無限ループ+タイムアウト機能ってのを実装したことがあるから
結局複雑な割にタイムアウトすることはまず無いので廃止したけどさ
2019/11/28(木) 07:05:43.89ID:uZo2jF8i
もしここに書いたらレビューするかもね
内容が気に入ればだけど
内容が気に入ればだけど
81デフォルトの名無しさん
2019/11/28(木) 08:08:54.32ID:f/6vs/+B いっぺんにアップできないから小出し。
#! /bin/bash
MAX_TIMER=10;
OLD_SECONDS=$SECONDS;
while true; do
cp_SECONDS=$SECONDS;
if [ $cp_SECONDS -ne $OLD_SECONDS ]; then
kill -SIGINT $$;
OLD_SECONDS=$cp_SECONDS;
fi
sleep 0.5;
done &
#! /bin/bash
MAX_TIMER=10;
OLD_SECONDS=$SECONDS;
while true; do
cp_SECONDS=$SECONDS;
if [ $cp_SECONDS -ne $OLD_SECONDS ]; then
kill -SIGINT $$;
OLD_SECONDS=$cp_SECONDS;
fi
sleep 0.5;
done &
82デフォルトの名無しさん
2019/11/28(木) 08:09:31.03ID:f/6vs/+B for ((aa = 0; aa < MAX_TIMER; aa++)); do
tim_flg[$aa]=0;
tim[$aa]=0;
#echo ${tim_flg[*]}
done;
tim_flg[$aa]=0;
tim[$aa]=0;
#echo ${tim_flg[*]}
done;
83デフォルトの名無しさん
2019/11/28(木) 08:09:55.57ID:f/6vs/+B trap '
for ((aa = 0; aa < MAX_TIMER; aa++)); do
if [ ${tim_flg[$aa]} -eq 1 ]; then
if [ ${tim[$aa]} -gt 0 ]; then
tim[$aa]=$((tim[$aa] - 1));
fi
fi
done
printf "%3d" ${tim[*]};
echo ":" $(date -R);
' SIGINT
for ((aa = 0; aa < MAX_TIMER; aa++)); do
if [ ${tim_flg[$aa]} -eq 1 ]; then
if [ ${tim[$aa]} -gt 0 ]; then
tim[$aa]=$((tim[$aa] - 1));
fi
fi
done
printf "%3d" ${tim[*]};
echo ":" $(date -R);
' SIGINT
84デフォルトの名無しさん
2019/11/28(木) 08:11:04.34ID:f/6vs/+B for((nn=0; nn < 10; nn++)); do
tim_flg[$nn]=1;
done
while true; do
for((nn=0; nn < 10; nn++)); do
if [ ${tim[$nn]} -eq 0 ]; then tim[$nn]=$((nn + 2)); fi
done
sleep 0.6
done;
終わり
tim_flg[$nn]=1;
done
while true; do
for((nn=0; nn < 10; nn++)); do
if [ ${tim[$nn]} -eq 0 ]; then tim[$nn]=$((nn + 2)); fi
done
sleep 0.6
done;
終わり
2019/11/28(木) 08:24:45.92ID:uZo2jF8i
なんか動いてるけど、何やってるのかわからんなw
とりあえずCTRL+Cで停止しなかった。
とりあえずCTRL+Cで停止しなかった。
86デフォルトの名無しさん
2019/11/28(木) 08:29:37.54ID:f/6vs/+B 動作を確認するためタイマーのカウントとセットを繰り返しています。
終了するためにはSIGKILLを与えてください。
終了するためにはSIGKILLを与えてください。
2019/11/28(木) 08:30:36.19ID:uZo2jF8i
しばし読んでみたけど、やっぱりわからんw
これ指定したn秒ごとにシグナル送るんじゃないのか?
tim配列とかtim_flgの意味がさっぱりだ
これ指定したn秒ごとにシグナル送るんじゃないのか?
tim配列とかtim_flgの意味がさっぱりだ
2019/11/28(木) 08:41:39.82ID:uZo2jF8i
簡単な所から。まずシグナルはSIGはいらんぞ。
bash限定ならそれでもいいがPOSIX的には無いほうが正しい。
INTはCTRL-Cなので、USR1またはUSR2、もしくはSIGHUPとかの方が良い。
セミコロンはC言語じゃないんだから行を継続しないときにはつけないのが一般的
bash限定ならそれでもいいがPOSIX的には無いほうが正しい。
INTはCTRL-Cなので、USR1またはUSR2、もしくはSIGHUPとかの方が良い。
セミコロンはC言語じゃないんだから行を継続しないときにはつけないのが一般的
89デフォルトの名無しさん
2019/11/28(木) 08:42:09.42ID:f/6vs/+B 各タイマが0になったらなんかをちょっとやり、またタイマをセットするというプログラムです
tim配列はタイマ本体です。tim_flg配列はタイマ使用/不使用のフラグです。
tim配列はタイマ本体です。tim_flg配列はタイマ使用/不使用のフラグです。
2019/11/28(木) 08:49:25.10ID:uZo2jF8i
やっと理解したが、これ説明なしに理解するの大変だぞw
本質的じゃないコードが複雑でそっちのほうが多すぎる。
本質的じゃないコードが複雑でそっちのほうが多すぎる。
2019/11/28(木) 08:51:32.36ID:uZo2jF8i
tim_flgの意味がないな。いや意図は想像できる。(というか>>89に書いてあるか)
サンプルとしてはノイズにしかなってないので理解ができない。
サンプルとしてはノイズにしかなってないので理解ができない。
2019/11/28(木) 21:14:01.96ID:uBUVzLWV
宿題の添削をしてやるとか親切たなw
2019/11/28(木) 21:36:47.47ID:asJppHFe
目的は、bash依存すんな。って言うことだったんだがなw
流石にbash依存してる部分が、本質的じゃない所ばかりだとやる気が。
バッサリ削ったら簡単に、bash依存なくせるんでどうしようかなと思いながらレス待ちw
流石にbash依存してる部分が、本質的じゃない所ばかりだとやる気が。
バッサリ削ったら簡単に、bash依存なくせるんでどうしようかなと思いながらレス待ちw
2019/11/28(木) 23:49:59.71ID:RaRUIeaw
bash依存しまくりで
https://wandbox.org/permlink/EHSiHk726Bn4qvVO
https://wandbox.org/permlink/EHSiHk726Bn4qvVO
95デフォルトの名無しさん
2019/11/29(金) 00:53:33.34ID:Fh79+8D6 あんまりソフトタイマに有用性を感じてもらえないようで残念でした。
2019/11/29(金) 01:09:45.97ID:IIqk2+5U
timeoutでやっつけ
2019/11/29(金) 02:19:44.34ID:XcyRQJ1W
2019/11/29(金) 04:30:20.91ID:9RHOSbKH
2019/11/29(金) 05:10:07.47ID:hA38q2SN
おれおれかよ
100デフォルトの名無しさん
2019/11/30(土) 00:04:41.28ID:FMRNVBPU Wgetであるサイトの特定のディレクトリ配下の特定のファイルを
ダウンロードしたくて下記のコマンドを書いてもルートのindex.html
しかダウンロードしてくれません。
これは何がまずいのでしょうか?
wget -r -A Download拡張子 -I /Downloadディレクトリ URL
ダウンロードしたくて下記のコマンドを書いてもルートのindex.html
しかダウンロードしてくれません。
これは何がまずいのでしょうか?
wget -r -A Download拡張子 -I /Downloadディレクトリ URL
101デフォルトの名無しさん
2019/11/30(土) 00:53:41.92ID:KUL76oc2 オプションに -e robots=off -U mozilla でも付けてみたら上手く行くかも
102デフォルトの名無しさん
2019/11/30(土) 00:54:25.61ID:czFcPKLy 碌に調べずの返答でアレなんだが多分訪問先のサイトがファイル一覧
を返すのを禁止してる(apache httpd だと Indexes オプションが有効
になってない)からだと思う
を返すのを禁止してる(apache httpd だと Indexes オプションが有効
になってない)からだと思う
103デフォルトの名無しさん
2019/11/30(土) 13:20:31.41ID:f33nsdyy リファラの偽装が必要かも。知らんけど
104デフォルトの名無しさん
2019/11/30(土) 16:49:40.30ID:mvBIEviw googleはbashがデフォルト
105デフォルトの名無しさん
2019/12/01(日) 11:47:31.42ID:0pH8jk7+ bash/zsh依存しまくりで
https://wandbox.org/permlink/moif346imXqiuDxD
そんなのが仮に必要でも
trap 'date -R' USR1
for (( i=1 ; i <= 10 ; i++ )); do
( sleep $i; kill -USR1 $$ ) &
done
wait
でいいだろとしか思わんけどw
https://wandbox.org/permlink/moif346imXqiuDxD
そんなのが仮に必要でも
trap 'date -R' USR1
for (( i=1 ; i <= 10 ; i++ )); do
( sleep $i; kill -USR1 $$ ) &
done
wait
でいいだろとしか思わんけどw
106デフォルトの名無しさん
2019/12/01(日) 19:22:22.28ID:IoGKXgrY >>91
tim_flgをゴミ扱いしたこいつがソフトタイマを理解していない。
tim_flgをゴミ扱いしたこいつがソフトタイマを理解していない。
107デフォルトの名無しさん
2019/12/01(日) 19:49:41.33ID:YWi4MX0G このサンプルでは1固定なんだからゴミやろ
108デフォルトの名無しさん
2019/12/02(月) 22:02:29.21ID:9nn8K+iP 親ディレクトリ
-子ディレ クトリ(1)
file(1).txt
file ().txt
-子デ ィレクトリ(2)
file(2) .txt
-子ディレクトリ(3)
fil e(3).txt
ディレクトリとファイル名の半角スペースと半角の()を_で置換したいのですが
どうやればいいのでしょうか
for dir in $(ls -d */); do
for f in ${dir}*; do
mv "$f" `echo $f|sed -e 's/[ ()]/_/g'`
done
done
これでディレクトリ名とファイル名はどうにかなったのですが、、
一回目ではディレクトリ名が変換されてしまうのでファイル名が変換されず
対応策として同じコードを2回実行してファイル名も変換しています
まず一回目にディレクトリ名を変換するために
for dir in $(ls -d */); do
mv "$dir" `echo $dir|sed -e 's/[ ()]/_/g'`
done
をやってみたのですが、statがなんやらと警告が出てきます
-子ディレ クトリ(1)
file(1).txt
file ().txt
-子デ ィレクトリ(2)
file(2) .txt
-子ディレクトリ(3)
fil e(3).txt
ディレクトリとファイル名の半角スペースと半角の()を_で置換したいのですが
どうやればいいのでしょうか
for dir in $(ls -d */); do
for f in ${dir}*; do
mv "$f" `echo $f|sed -e 's/[ ()]/_/g'`
done
done
これでディレクトリ名とファイル名はどうにかなったのですが、、
一回目ではディレクトリ名が変換されてしまうのでファイル名が変換されず
対応策として同じコードを2回実行してファイル名も変換しています
まず一回目にディレクトリ名を変換するために
for dir in $(ls -d */); do
mv "$dir" `echo $dir|sed -e 's/[ ()]/_/g'`
done
をやってみたのですが、statがなんやらと警告が出てきます
109デフォルトの名無しさん
2019/12/02(月) 22:13:56.47ID:cDa5fVnx そういう用途なら、forとかlsとか使わないでfind使え
110デフォルトの名無しさん
2019/12/02(月) 22:15:41.19ID:cDa5fVnx いきなりstatがでるような事はやめて、
echo mv なんとか かんとか で実行命令を表示するようにしろ
怖すぎるわ。それやればなんとかなるだろ
echo mv なんとか かんとか で実行命令を表示するようにしろ
怖すぎるわ。それやればなんとかなるだろ
111デフォルトの名無しさん
2019/12/02(月) 22:19:56.11ID:agtAae1a rename 関係はperlで試せる dry run 作ってる
https://pastebin.com/0uJ462jq
touch "file(1).txt"; ~/bin/rename.pl dry 'tr/[()]/_/' *txt
file(1).txt => file_1_.txt
~/bin/rename.pl run 'tr/[()]/_/' *txt; ls
file_1_.txt
https://pastebin.com/0uJ462jq
touch "file(1).txt"; ~/bin/rename.pl dry 'tr/[()]/_/' *txt
file(1).txt => file_1_.txt
~/bin/rename.pl run 'tr/[()]/_/' *txt; ls
file_1_.txt
112デフォルトの名無しさん
2019/12/02(月) 22:46:09.47ID:RT0MauQR find . -name '*[ ()]*' -print | sort -r | while read item; do
mv "$item" "${item%/*}/$(echo "${item##*/}" | tr ' ()' '_')"
done
mv "$item" "${item%/*}/$(echo "${item##*/}" | tr ' ()' '_')"
done
113デフォルトの名無しさん
2019/12/03(火) 07:24:55.79ID:v9g/lO5M Ruby で作った。
コードは次のレスに書く
DryRun を使ったので実際には、変更されない
ファイル/ディレクトリは、同時に変更すると、バグるかも知れないので、別々に変更する。
また「子ディレクトリ(1)/孫ディレクトリ(1)」のように、2か所以上同時に変更すると、バグるかも知れない
こんな複雑なものを、シェルスクリプトで書くのは超危険!
特に移動は、dest が存在するときは移動になり、
存在しないときは変更になるという、極めて難しい場合分けが必要で、
処理の途中でエラーになると、エラーまでの処理が確定してしまうから、中途半端で巻き戻せないから、
必ず、親ディレクトリ以下のバックアップを取っておく!
コードは次のレスに書く
DryRun を使ったので実際には、変更されない
ファイル/ディレクトリは、同時に変更すると、バグるかも知れないので、別々に変更する。
また「子ディレクトリ(1)/孫ディレクトリ(1)」のように、2か所以上同時に変更すると、バグるかも知れない
こんな複雑なものを、シェルスクリプトで書くのは超危険!
特に移動は、dest が存在するときは移動になり、
存在しないときは変更になるという、極めて難しい場合分けが必要で、
処理の途中でエラーになると、エラーまでの処理が確定してしまうから、中途半端で巻き戻せないから、
必ず、親ディレクトリ以下のバックアップを取っておく!
114113
2019/12/03(火) 07:25:55.85ID:v9g/lO5M require 'fileutils'
root_dir = "C:/Users/Owner/Documents/Ruby/test/**/*" # 基準ディレクトリ
# 変更前のファイル/ディレクトリを入れる配列
src_files = [ ]; src_dirs = [ ]
# 基準ディレクトリ以下のファイル/ディレクトリを取り出して、配列に入れる
Dir.glob( root_dir ) do |path|
case
when File.file?( path ) then src_files.push ( path )
when File.directory?( path ) then src_dirs.push ( path )
else # 処理しない
end
end
def change_paths( src_ary ) # ファイル/ディレクトリ名を変更する
src_ary.each do |src_path|
dest_path = src_path.tr( " ()", "_" ) # 変換
next if src_path == dest_path # 変換されなかった場合は、処理しない
# 変更後の名前のファイル/ディレクトリが、既に存在すれば、エラー
msg = "変更後の名前のファイル/ディレクトリが、既に存在します!\n#{ dest_path }"
raise msg if File.exist? ( dest_path )
FileUtils::DryRun.move( src_path, dest_path )
end
end
change_paths( src_dirs )
change_paths( src_files )
root_dir = "C:/Users/Owner/Documents/Ruby/test/**/*" # 基準ディレクトリ
# 変更前のファイル/ディレクトリを入れる配列
src_files = [ ]; src_dirs = [ ]
# 基準ディレクトリ以下のファイル/ディレクトリを取り出して、配列に入れる
Dir.glob( root_dir ) do |path|
case
when File.file?( path ) then src_files.push ( path )
when File.directory?( path ) then src_dirs.push ( path )
else # 処理しない
end
end
def change_paths( src_ary ) # ファイル/ディレクトリ名を変更する
src_ary.each do |src_path|
dest_path = src_path.tr( " ()", "_" ) # 変換
next if src_path == dest_path # 変換されなかった場合は、処理しない
# 変更後の名前のファイル/ディレクトリが、既に存在すれば、エラー
msg = "変更後の名前のファイル/ディレクトリが、既に存在します!\n#{ dest_path }"
raise msg if File.exist? ( dest_path )
FileUtils::DryRun.move( src_path, dest_path )
end
end
change_paths( src_dirs )
change_paths( src_files )
115デフォルトの名無しさん
2019/12/03(火) 08:29:02.93ID:ujGDA/f+ なんかかえってめんどくさいことしてんな。perlでめんどくさく書きたいだけ?
116デフォルトの名無しさん
2019/12/03(火) 08:29:47.31ID:ujGDA/f+ perlではなくrubyか。しつれい
117113
2019/12/03(火) 09:46:02.07ID:v9g/lO5M mv を作った奴は、頭おかしいw
dest が存在するときは移動になり、
存在しないときは名前の変更になるという、極めて難しい場合分けが必要だから
漏れらが欲しいのは、
rename だけする関数と、移動するだけの関数の、2つに分かれている関数
それが分かれていないから、自分で処理を分けて、
かなりチェックしないと、バグってしまう
dest が存在するときは移動になり、
存在しないときは名前の変更になるという、極めて難しい場合分けが必要だから
漏れらが欲しいのは、
rename だけする関数と、移動するだけの関数の、2つに分かれている関数
それが分かれていないから、自分で処理を分けて、
かなりチェックしないと、バグってしまう
118デフォルトの名無しさん
2019/12/03(火) 12:17:58.24ID:5ZiHQIvd つまり自分に都合が悪い仕様=バグ
119デフォルトの名無しさん
2019/12/03(火) 12:28:33.61ID:Uh1tIUQA 一括リネームってたいてい複雑になるから
GUIツールを使ったほうが良いと思うんだよね
Windows 10版のPowerToysにリネーム機能が追加
https://pc.watch.impress.co.jp/docs/news/1215602.html
GUIツールを使ったほうが良いと思うんだよね
Windows 10版のPowerToysにリネーム機能が追加
https://pc.watch.impress.co.jp/docs/news/1215602.html
120デフォルトの名無しさん
2019/12/03(火) 18:09:42.76ID:+zVWCKlo >>112
Fix(IFS文字が頭と末尾にある場合。dirname,basenameにしたのは気分)&Variation
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
mv "$item" "$(dirname "$item")/$(basename "$item" | tr ' ()' '_')"
done)
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
dir="$(dirname "$item")"; newname="$(basename "$item" | tr ' ()' '_')"; newpath="$dir/$newname"
[ ! -e "$newpath" ] && mv "$item" "$newpath" || echo "can't rename $item, exists $newname" >&2
done
# can't rename $item 〜 メッセージは単なる目安
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
dir="${item%/*}"; newname="$(tr ' ()' '_' <<< ${item##*/})"
[ -e "$dir/$newname" ] && {
name="${newname%.*}_"
ext="${newname#*.}"; [ "$ext" = "$newname" ] && ext='' || ext=".$ext"
while [ -e "$dir/$name$ext" ]; do
name+='_'
done
newname="$name$ext"
}
mv "$item" "$dir/$newname"
done)
Fix(IFS文字が頭と末尾にある場合。dirname,basenameにしたのは気分)&Variation
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
mv "$item" "$(dirname "$item")/$(basename "$item" | tr ' ()' '_')"
done)
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
dir="$(dirname "$item")"; newname="$(basename "$item" | tr ' ()' '_')"; newpath="$dir/$newname"
[ ! -e "$newpath" ] && mv "$item" "$newpath" || echo "can't rename $item, exists $newname" >&2
done
# can't rename $item 〜 メッセージは単なる目安
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
dir="${item%/*}"; newname="$(tr ' ()' '_' <<< ${item##*/})"
[ -e "$dir/$newname" ] && {
name="${newname%.*}_"
ext="${newname#*.}"; [ "$ext" = "$newname" ] && ext='' || ext=".$ext"
while [ -e "$dir/$name$ext" ]; do
name+='_'
done
newname="$name$ext"
}
mv "$item" "$dir/$newname"
done)
121デフォルトの名無しさん
2019/12/03(火) 18:14:03.14ID:+zVWCKlo122デフォルトの名無しさん
2019/12/03(火) 18:30:56.19ID:HnkJN8FN >>111
rename自体がperlだしちゃんと試行もあるけど
rename自体がperlだしちゃんと試行もあるけど
123デフォルトの名無しさん
2019/12/03(火) 19:27:45.48ID:mUaHu9IR124デフォルトの名無しさん
2019/12/03(火) 19:44:49.63ID:R2wB6lmg Linuxディストリによっては標準で入っている、perlスクリプトで作られたrenameコマンドのことだろ
125デフォルトの名無しさん
2019/12/03(火) 20:48:36.39ID:jDo5c24e renameは標準で入ってないとはいえ
テスト無しの自作コードでやるような処理じゃないやろ
find -depth -exec rename -nでdry-runしてから-n消せばいい
テスト無しの自作コードでやるような処理じゃないやろ
find -depth -exec rename -nでdry-runしてから-n消せばいい
126デフォルトの名無しさん
2019/12/03(火) 21:32:10.96ID:yTVXI633 話のネタから外れて何を主張したいのだか
127デフォルトの名無しさん
2019/12/03(火) 22:25:15.93ID:yTVXI633 dry-runって言っても結局ひとつをrename/mvするその時点での状態でしか判断してないし、mvコマンドの前にecho付けるのと何が違うのだか
[ "$1" = "-n" ] && nac=echo || nac=''
$nac mv ...
でスイッチにしたけりゃ同じようにできるだろし
極めて難しいらしいことも結局時点での存在チェックしてるだけで、シェルスクリプトでtestを使うのと何がそうも極めて難しいほど違うのか
>>122
既に存在してたらエラー(オプションによって強行もできる)でもあるよね
The original C<rename> did not check for the existence of target filenames,
so had to be used with care. I hope I've fixed that (Robin Barker).
って、わざわざコメント書くようにな目玉なw
どのバージョンを使ってるのかわからんけど、パッケージによってはものすごいオプション拡張されたのが使われてるねえ
[ "$1" = "-n" ] && nac=echo || nac=''
$nac mv ...
でスイッチにしたけりゃ同じようにできるだろし
極めて難しいらしいことも結局時点での存在チェックしてるだけで、シェルスクリプトでtestを使うのと何がそうも極めて難しいほど違うのか
>>122
既に存在してたらエラー(オプションによって強行もできる)でもあるよね
The original C<rename> did not check for the existence of target filenames,
so had to be used with care. I hope I've fixed that (Robin Barker).
って、わざわざコメント書くようにな目玉なw
どのバージョンを使ってるのかわからんけど、パッケージによってはものすごいオプション拡張されたのが使われてるねえ
128113
2019/12/03(火) 23:09:51.48ID:v9g/lO5M Windows10, WSL, Ubuntu 16.04 にも、/usr/bin/rename がある
この手の処理の何がヤバイかと言うと、
例えば、3つ目の処理で、エラーが出ると、
2つ目までは、変更されてしまっているから、
そこから再実行すると、最初から実行していた時と、初期条件が変わっている
データベースと同じで、一部分だけ更新されたような、中途半端な状態になってはいけない(一貫性)。
エラー時には、すべてをロールバックするべき。
または、全体のバックアップを取っておく
すべてを更新するか、すべてをロールバックするのどちらかの状態だけにする
この手の処理の何がヤバイかと言うと、
例えば、3つ目の処理で、エラーが出ると、
2つ目までは、変更されてしまっているから、
そこから再実行すると、最初から実行していた時と、初期条件が変わっている
データベースと同じで、一部分だけ更新されたような、中途半端な状態になってはいけない(一貫性)。
エラー時には、すべてをロールバックするべき。
または、全体のバックアップを取っておく
すべてを更新するか、すべてをロールバックするのどちらかの状態だけにする
129デフォルトの名無しさん
2019/12/03(火) 23:14:22.94ID:50yNXJCt 自作コードがそれ以下なのになにを言っているのだか
130デフォルトの名無しさん
2019/12/04(水) 00:03:09.04ID:LOcDYH/A >>108
まだ見てくれてる? 変更するんじゃなくて新たに作るほうが無難だと思うよ。
新たに作るといっても通常ファイルはハードリンクできるからね。
実際にやってみたよ。
$ find a
a
a/a (0)
a/a (0)/a (00)
a/a (0)/a (01)
a/a (1)
a/a (1)/a (11)
a/a (1)/a (10)
$ find b
b
$ cd a
$ find * -type d | perl -ne 'chop; s/[ ()]/_/g ; mkdir("../b/$_") || die("$!:$_");'
$ find * -type f | perl -ne 'chop; $old = $_; s/[ ()]/_/g ; link( $old,"../b/$_") || die("$!:$_");'
$ cd ..
$ find b
b
b/a__1_
b/a__1_/a__10_
b/a__1_/a__11_
b/a__0_
b/a__0_/a__00_
b/a__0_/a__01_
$
途中で何か起こっても起こらなくても a の方は無傷だからね。好きなだけやり直せるよ。
まだ見てくれてる? 変更するんじゃなくて新たに作るほうが無難だと思うよ。
新たに作るといっても通常ファイルはハードリンクできるからね。
実際にやってみたよ。
$ find a
a
a/a (0)
a/a (0)/a (00)
a/a (0)/a (01)
a/a (1)
a/a (1)/a (11)
a/a (1)/a (10)
$ find b
b
$ cd a
$ find * -type d | perl -ne 'chop; s/[ ()]/_/g ; mkdir("../b/$_") || die("$!:$_");'
$ find * -type f | perl -ne 'chop; $old = $_; s/[ ()]/_/g ; link( $old,"../b/$_") || die("$!:$_");'
$ cd ..
$ find b
b
b/a__1_
b/a__1_/a__10_
b/a__1_/a__11_
b/a__0_
b/a__0_/a__00_
b/a__0_/a__01_
$
途中で何か起こっても起こらなくても a の方は無傷だからね。好きなだけやり直せるよ。
131デフォルトの名無しさん
2019/12/04(水) 02:51:13.25ID:hySlbdZs pax -rwlpe src dst
132デフォルトの名無しさん
2019/12/04(水) 23:27:09.69ID:xn8KyTI4 renameコマンドって複数ないか?
's/パターン/置換文字/' FILEとパターン 置換文字 FILEとサイトによって説明違うんだよな
俺が散らばったファイルをリネームする時はmoreutilsのvidir使ってるけど
テキストエディタで修正する奴な
's/パターン/置換文字/' FILEとパターン 置換文字 FILEとサイトによって説明違うんだよな
俺が散らばったファイルをリネームする時はmoreutilsのvidir使ってるけど
テキストエディタで修正する奴な
133デフォルトの名無しさん
2019/12/05(木) 00:34:07.65ID:0uggokQM Larry Wall and Robin Barker版とそれの機能拡張版のAristotle Pagaltzis版じゃね
Aristotle Pagaltzisで増えた -s パターン 置換文字 FILE 使ってじゃないの
Aristotle Pagaltzisで増えた -s パターン 置換文字 FILE 使ってじゃないの
134デフォルトの名無しさん
2019/12/05(木) 11:01:01.81ID:3XJjcX6a >>132
util-linux版とperl同梱版(これはさらにいくつかに分かれる)の違い
debian/ubuntu なら前者rename.ul後者rename(Larry Wall版)
centos なら前者rename後者prename(Peder Stray版)
util-linux版とperl同梱版(これはさらにいくつかに分かれる)の違い
debian/ubuntu なら前者rename.ul後者rename(Larry Wall版)
centos なら前者rename後者prename(Peder Stray版)
135デフォルトの名無しさん
2019/12/05(木) 11:02:39.94ID:6ZFP3Xq2136デフォルトの名無しさん
2019/12/05(木) 15:05:31.16ID:0uggokQM Larry Wall
- Robin Barker, 重複時実行しない、 重複時実行強制実行オプション
-- Aristotle Pagaltzis, 機能いろいろ (>>132 のはそのうちの -s/--subst from to じゃないの)
- Peder Stray, 重複時バックアップオプション
Aristotle Pagaltzis意外はそんなに変わらんかな。Aristotle Pagaltzisで追加した機能を使わなければAristotle Pagaltzisも
https://github.com/tldr-pages/tldr/issues/3125
Debian prename from pkg perl: Robin Barker & Larry Wall.
Debian/Ubuntu file-rename from pkg file-rename: Larry Wall.
Arch perl-rename from pkg perl-rename: Peder Stray (same as Fedora).
Fedora prename from pkg prename: Peder Stray (same as Arch).
macOS rename from pkg rename: Aristotle Pagaltzis.
らしいけど、Larry Wall版ってあるのか?Ubuntu は Larry Wall and Robin Barker だな
- Robin Barker, 重複時実行しない、 重複時実行強制実行オプション
-- Aristotle Pagaltzis, 機能いろいろ (>>132 のはそのうちの -s/--subst from to じゃないの)
- Peder Stray, 重複時バックアップオプション
Aristotle Pagaltzis意外はそんなに変わらんかな。Aristotle Pagaltzisで追加した機能を使わなければAristotle Pagaltzisも
https://github.com/tldr-pages/tldr/issues/3125
Debian prename from pkg perl: Robin Barker & Larry Wall.
Debian/Ubuntu file-rename from pkg file-rename: Larry Wall.
Arch perl-rename from pkg perl-rename: Peder Stray (same as Fedora).
Fedora prename from pkg prename: Peder Stray (same as Arch).
macOS rename from pkg rename: Aristotle Pagaltzis.
らしいけど、Larry Wall版ってあるのか?Ubuntu は Larry Wall and Robin Barker だな
137デフォルトの名無しさん
2019/12/05(木) 15:14:33.96ID:TzSLtKO4 たぶん基本的なことだと思うんですが、教えてください。
#!/bin/bash
echo -e \
'Hostname\tIP\tInterface\tVlan\tMode\tPort-Channel\tAllowed\sVlan\tDescription'\
> cp.tsv
このスクリプトを実行すると…
$cat cp.tsv
-e Hostname IP Interface Vlan Mode Port-Channel Allowed Vlan Description
このように、先頭に-eが入ってしまいます。なぜでしょう…?
#!/bin/bash
echo -e \
'Hostname\tIP\tInterface\tVlan\tMode\tPort-Channel\tAllowed\sVlan\tDescription'\
> cp.tsv
このスクリプトを実行すると…
$cat cp.tsv
-e Hostname IP Interface Vlan Mode Port-Channel Allowed Vlan Description
このように、先頭に-eが入ってしまいます。なぜでしょう…?
138デフォルトの名無しさん
2019/12/05(木) 15:19:51.21ID:0uggokQM Perl同梱(?)のprename/file-renameがLarry Wall版か
Ubuntuで pkg rename (pkg file-rename??)を入れるとprename/file-renameもLarry Wall and Robin Barker版に上書きされる感じかな??
Ubuntuで pkg rename (pkg file-rename??)を入れるとprename/file-renameもLarry Wall and Robin Barker版に上書きされる感じかな??
139デフォルトの名無しさん
2019/12/05(木) 15:21:52.11ID:0uggokQM140デフォルトの名無しさん
2019/12/05(木) 15:22:44.42ID:WdOnkWYr141デフォルトの名無しさん
2019/12/05(木) 15:55:06.05ID:Gb1I+/8K142デフォルトの名無しさん
2019/12/05(木) 15:58:33.95ID:TzSLtKO4 >>140-141
あ、ほんとだ。
sh -xで実行してました。
bash -xだと大丈夫でした。
シェバン付けてるから大丈夫だと思い込んでました。ダメなんですね。
横着せずにきちんと打つようにします。
ありがとうございました!
あ、ほんとだ。
sh -xで実行してました。
bash -xだと大丈夫でした。
シェバン付けてるから大丈夫だと思い込んでました。ダメなんですね。
横着せずにきちんと打つようにします。
ありがとうございました!
143デフォルトの名無しさん
2019/12/06(金) 20:34:56.63ID:08yg4gJX 宇宙刑事シェバン
144デフォルトの名無しさん
2019/12/10(火) 22:30:09.16ID:zD6aLrgM x-y
↑こういう形式の,ハイフンで結ばれた二つの数字の計算結果の正負だけを知りたいのですが,
なるべく処理が早い方法ないですか。
対象の文字列は標準出力ではなくて変数に格納されています。
思い付いたのは
[ ${var%-*} -lt ${var#*-} ]
か
$((var < 0))
です。
どっちもPOSIXには準拠している筈ですが,同じような処理を大量に繰り返すとどうしても遅くなります。
これがシェルスクリプトの限界なら,仕方ないのですが,もう少し最適化できそうな気もします。
どうかお知恵とお力を貸してください。
↑こういう形式の,ハイフンで結ばれた二つの数字の計算結果の正負だけを知りたいのですが,
なるべく処理が早い方法ないですか。
対象の文字列は標準出力ではなくて変数に格納されています。
思い付いたのは
[ ${var%-*} -lt ${var#*-} ]
か
$((var < 0))
です。
どっちもPOSIXには準拠している筈ですが,同じような処理を大量に繰り返すとどうしても遅くなります。
これがシェルスクリプトの限界なら,仕方ないのですが,もう少し最適化できそうな気もします。
どうかお知恵とお力を貸してください。
145デフォルトの名無しさん
2019/12/10(火) 23:18:51.56ID:kdXCWOtW $((var < 0))はPOSIX準拠じゃなくね?
やるなら [ $(($var)) -lt 0 ] こうだろうけど
それでも遅いって言うならどうしようもないと思うが、
気になるほど遅いなら別のところに問題があるんじゃね?
やるなら [ $(($var)) -lt 0 ] こうだろうけど
それでも遅いって言うならどうしようもないと思うが、
気になるほど遅いなら別のところに問題があるんじゃね?
146デフォルトの名無しさん
2019/12/10(火) 23:24:09.60ID:kdXCWOtW ちなみにうちのマシンだとこんな感じ
$ time sh -c 'var=1-2; i=0; while [ $i -lt 1000000 ]; do [ $(($var)) -lt 0 ]; i=$((i+1)); done'
real 0m2.722s
user 0m2.718s
sys 0m0.004s
100万やって3秒、1万回だと0.03秒。これが気になるとしたら
相当多くの数の計算をしてることになるはずなんだが本当に?
$ time sh -c 'var=1-2; i=0; while [ $i -lt 1000000 ]; do [ $(($var)) -lt 0 ]; i=$((i+1)); done'
real 0m2.722s
user 0m2.718s
sys 0m0.004s
100万やって3秒、1万回だと0.03秒。これが気になるとしたら
相当多くの数の計算をしてることになるはずなんだが本当に?
147デフォルトの名無しさん
2019/12/10(火) 23:25:16.53ID:SL+fGedD echo "$var<0"|bc
148デフォルトの名無しさん
2019/12/10(火) 23:28:35.11ID:kdXCWOtW bcプロセス起動してるから遅い
それは実行しなくてもわかる
それは実行しなくてもわかる
149デフォルトの名無しさん
2019/12/10(火) 23:50:31.02ID:kdXCWOtW あとオマケ、速いとは思えないけど
IFS=-
var=1-2
set -- $var
echo $1 # 1
echo $2 # 2
これを使ってもできる。
速さは [ ${var%-*} -lt ${var#*-} ] とどっこいどっこいだろうな
もしかしたらset使ったほうが速いかもしれない程度
IFS=-
var=1-2
set -- $var
echo $1 # 1
echo $2 # 2
これを使ってもできる。
速さは [ ${var%-*} -lt ${var#*-} ] とどっこいどっこいだろうな
もしかしたらset使ったほうが速いかもしれない程度
150デフォルトの名無しさん
2019/12/10(火) 23:51:59.49ID:LOypIkS3151デフォルトの名無しさん
2019/12/10(火) 23:59:28.15ID:kdXCWOtW152デフォルトの名無しさん
2019/12/11(水) 00:00:32.26ID:ivhCTlPt i7 3.4Ghzって今どき低スペックなのか?
ハイスペックかと思ってた
ハイスペックかと思ってた
153デフォルトの名無しさん
2019/12/11(水) 00:00:55.23ID:5YQOA1oq154デフォルトの名無しさん
2019/12/11(水) 00:03:27.10ID:5YQOA1oq >>152
スペックは低くはないと思うけどさ、もう古いし
中古だと2〜3万円台で搭載パソコンを買えちゃうよ
https://used.dospara.co.jp/sale/search.php?view=1&kw=Core%20i7%203770&page=1
スペックは低くはないと思うけどさ、もう古いし
中古だと2〜3万円台で搭載パソコンを買えちゃうよ
https://used.dospara.co.jp/sale/search.php?view=1&kw=Core%20i7%203770&page=1
155デフォルトの名無しさん
2019/12/11(水) 00:11:26.60ID:ivhCTlPt■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【学術団体】高市総理の台湾有事に関する発言を巡り、学者らが日中関係修復を求める緊急声明を発表… [BFU★]
- 「脅迫だ」国分太一に同情論 音声データ削除要求など日テレの対応を疑問視する声ネットに噴出「それこそコンプラ違反では」 [muffin★]
- 中国と対話で良い関係つくるのが責任と首相 ★4 [少考さん★]
- 生クリームだけの真っ白なクリスマスケーキ 大手メーカーが販売、その理由は…フルーツなしで価格は半額以下に ★3 [おっさん友の会★]
- 【文春】元TOKIO・国分太一(51)「女性スタッフ2名への“わいせつ事案”」日テレ事情聴取の全貌が分かった! ★4 [Ailuropoda melanoleuca★]
- 【国際法を無視】日本での「中華人民共和国に台湾問題を論じる資格なし」との声に 中国外交部が厳しく反論… [BFU★]
- 【実況】博衣こよりのえちえちSSholox4周年切り抜き鑑賞🧪★2
- 【実況】博衣こよりのえちえちSSholox4周年切り抜き鑑賞🧪★3
- 【衝撃】ネトウヨ「半額シール」というコテと42歳が討論した結果、 人生このままでいいのだろうか [974680522]
- ヤンジャン新人漫画大賞、入賞作品のAI絵疑惑で大荒れ😄😄😄 高市早苗要素あり [175344491]
- 現役JKのお茶会スレ( ¨̮ )︎︎𖠚ᐝ167
- 【悲報】野田佳彦、高市さんの『存立危機事態』答弁を撤回 [519511584]
