私は現在のディレクトリ内の一致するすべてのファイルの拡張子を変更します関数を記述しようとしています:ワイルドカードでargvを使用するにはどうすればよいですか?
function chext
if count $args -eq 2 > /dev/null
for f in (ls *$argv[1])
mv (basename $f $argv[2]) (basename $f $argv[1])
end
else
echo "Error: use the following syntax"
echo "chext oldext newext"
end
end
私もこの出力を得続ける:
(*master) λ chext markdown txt
No matches for wildcard '*$argv[1]'. (Tip: empty matches are allowed in 'set', 'count', 'for'.)
~/.config/fish/config.fish (line 1): ls *$argv[1]
^
in command substitution
called on line 60 of file ~/.config/fish/config.fish
in function 'chext'
called on standard input
with parameter list 'markdown txt'
私は存在する必要があります知っています変数を補間し、*
をワイルドカードとして保持する方法ですが、わかりません。私は(string join '*' $argv[1])
を使ってみましたが、ワイルドカードを文字列に変換しました。
私はほとんど仕事にこれを手に入れた:それは私のファイルのすべてだったのエラーを与え、その後、私のすべてのファイルから拡張子を取り除いたが、新しいものを追加していない
function chext
if count $args -eq 2 > /dev/null
for f in (ls (string join * $argv[1]))
mv (basename $f $argv[2]) (basename $f $argv[1])
end
else
echo "Error: use the following syntax"
echo "chext oldext newext"
end
end
結合した名前とファイル名が長すぎます。
UPDATE:
私は正しいls
作業を取得する方法があると確信しているが、私はこれが正常に働いて取得しました:
if count $args -eq 2 > /dev/null
for f in (ls)
mv $f (string replace -r \.$argv[1]\$ .$argv[2] (basename $f))
end
else
echo "Error: use the following syntax"
echo "chext oldext newext"
end
end
うわー、これらの問題を通過するために時間を費やしてくれてありがとう!私は別のSOの投稿に 'ls'と' basename'部分を見つけて、それらを利用しようとしましたが、あなたが見ることができるように、うまくいきませんでした。私は文字列置換を使用して私の質問に追加した解決策が正しいことを確認してうれしいです。再度、感謝します! – Brandon