find, xargsコマンドの文字列置換における、バッククォート内のプログラムの挙動
カレントディレクトリに
hoge1.txt
hoge2.txt
hoge3.txt
があったとして、
$ ls -1 *.txt 2> /dev/null|xargs -n 1 -I XXX echo `basename XXX .txt`
と実行して、「拡張子を抜こう」としたところ、
hoge1.txt
hoge2.txt
hoge3.txt
と表示されてしまった。
「???」となって、
$ find . -name "*.txt" -exec echo `basename {} .txt` \;
としても結果は同じ。
更に、
ls -1 *.txt 2> /dev/null|xargs -n 1 -I XXX basename XXX .txt
だと、
hoge1
hoge2
hoge3
と想定どおりの結果となった。
「なんでこうなるんだろ???」
詳細を調べた結果、バッククォート内でリプレースされる文字列と、プログラムに渡される引数に食い違いが発生する(argvの文字列と、文字列の長さが合ってない)みたいで、「これってシェルのバグじゃね?」みたいな感じに… (いや、私が無知なだけなのですが。(^^ゞ)
仕方がないので、別にプログラム(というかスクリプト)を組んで、そこで個別に変数に展開したものを渡して問題を解決しました。(策士策に溺れた。1行でエレガントに行きたかったのに…)
はぁぁ… これを調べてて1時間とか経つなんて、悲しいです。
今日もここまででタイムアウトかな。
「こんなハズではーなかったに。」(by アスレチックランドゲームのCM)
まぁ、今まで手作業だったものが、今後はコマンド一発なのでいいや。この時間は投資と思おう。
いつつぱつへんかん!(by ATOK)
ちなみに上の例はあくまで挙動の話で、私が実現したかった内容とは違います。m(_ _)m
hoge1.txt
hoge2.txt
hoge3.txt
があったとして、
$ ls -1 *.txt 2> /dev/null|xargs -n 1 -I XXX echo `basename XXX .txt`
と実行して、「拡張子を抜こう」としたところ、
hoge1.txt
hoge2.txt
hoge3.txt
と表示されてしまった。
「???」となって、
$ find . -name "*.txt" -exec echo `basename {} .txt` \;
としても結果は同じ。
更に、
ls -1 *.txt 2> /dev/null|xargs -n 1 -I XXX basename XXX .txt
だと、
hoge1
hoge2
hoge3
と想定どおりの結果となった。
「なんでこうなるんだろ???」
詳細を調べた結果、バッククォート内でリプレースされる文字列と、プログラムに渡される引数に食い違いが発生する(argvの文字列と、文字列の長さが合ってない)みたいで、「これってシェルのバグじゃね?」みたいな感じに… (いや、私が無知なだけなのですが。(^^ゞ)
仕方がないので、別にプログラム(というかスクリプト)を組んで、そこで個別に変数に展開したものを渡して問題を解決しました。(策士策に溺れた。1行でエレガントに行きたかったのに…)
はぁぁ… これを調べてて1時間とか経つなんて、悲しいです。
今日もここまででタイムアウトかな。
「こんなハズではーなかったに。」(by アスレチックランドゲームのCM)
まぁ、今まで手作業だったものが、今後はコマンド一発なのでいいや。この時間は投資と思おう。
いつつぱつへんかん!(by ATOK)
ちなみに上の例はあくまで挙動の話で、私が実現したかった内容とは違います。m(_ _)m
コメント
コメントの投稿