1

ディレクトリの内容:

$ ls | awk '1'
ala
cztery.AVI
dwa.AvI
Jeden.aVI
lupa.com
PIĘĆ.AVI
trzy.Avi
zero.avi

このコマンドは以下を出力します。

$ ls | awk '$0=tolower($0){a=substr($0,1,length($0)-4)}{if(/avi$/){system("echo "$0" "a"\".mpg\"")}}'
cztery.avi cztery.mpg
dwa.avi dwa.mpg
jeden.avi jeden.mpg
pięć.avi pięć.mpg
trzy.avi trzy.mpg
zero.avi zero.mpg

上記のコマンドを改善するにはどうすればよいですか? 印刷したい:

cztery.avi cztery.mpg
dwa.avi dwa.mpg
jeden.avi Jeden.mpg
pięć.avi PIĘĆ.mpg
trzy.avi trzy.mpg
zero.avi zero.mpg
4

4 に答える 4

3

一方通行:

ls  *[aA][vV][iI] | awk '{print tolower($0) " " substr($0,0,length($0)-3)"mpg";}'
于 2012-12-10T14:21:21.247 に答える
3

aviすべてのファイルを一致させるために最初に検索を使用するのはどうですか:

$ find -iname "*.avi" -exec basename {} \; | awk -F. '{print tolower($1) ".avi", $1 ".mpg"}'
cztery.avi cztery.mpg
dwa.avi dwa.mpg
jeden.avi Jeden.mpg
pięć.avi PIĘĆ.mpg
trzy.avi trzy.mpg
zero.avi zero.mpg

$ ls -1 # Use the -1 option of ls instead of ls | awk '1'
ala
cztery.AVI
dwa.AvI
Jeden.aVI
lupa.com
PIĘĆ.AVI
trzy.Avi
zero.avi

最短の解決策を探している場合は、Gurulsを my とともに使用しawkます。

ls *.[aA][vV][iI] | awk -F. '{print tolower($1)".avi",$1".mpg"}'
cztery.avi cztery.mpg
dwa.avi dwa.mpg
jeden.avi Jeden.mpg
pięć.avi PIĘĆ.mpg
trzy.avi trzy.mpg
zero.avi zero.mpg
于 2012-12-10T13:40:43.567 に答える
1

を使用してそれを行う方法は次のGNU awkとおりです。

for i in *.[Aa][Vv][Ii]; do echo "$(echo $i | awk '{ print tolower($0), gensub(/...$/,"mpg","") }')"; done

結果:

cztery.avi cztery.mpg
dwa.avi dwa.mpg
jeden.avi Jeden.mpg
pięć.avi PIĘĆ.mpg
trzy.avi trzy.mpg
zero.avi zero.mpg
于 2012-12-10T14:43:12.740 に答える
1
ls | awk '{lc=tolower($0)} lc~/\.avi$/{sub(/...$/,"mpg"); print lc,$0}'

これは、改行を含むファイル名では機能しないことに注意してください。そのような状況がある場合は、お知らせください。

以下のコメントで次のように述べています。

システムにこのコマンドを実行させたい ->

ls | awk '{a=substr($0,1,length($0)-4)}/avi$|AVI$/{system("ffmpeg -i "$0" -f avi -vcodec libxvid "a"\".mpg\"")}'

私が言ったように、それはそれについて正しい方法で考えていないだけです. 明示的にするために、これを行っています:

shell ( ls | awk ( system( shell ( ffmpeg ) ) ) )

これはもっと理にかなっていませんか:

shell ( ls | awk; ffmpeg )

すべてシェルで自明に行われているため、これに awk を使用している理由は実際にはわかりませんが、理由があると仮定すると、投稿したものを実装する正しい方法は次のとおりです。

ls *.avi *.AVI |
awk '{print $0, substr($0,1,length($0)-3) "\"mpg\""}' |
while read -r orig mpeg
do
    ffmpeg -i "$orig" -f avi -vcodec libxvid "$mpeg"
done

ファイル名にスペースが含まれていると失敗することに注意してください。

ls *.avi *.AVI |
while IFS= read -r orig
do
    ffmpeg -i "$orig" -f avi -vcodec libxvid "${orig%avi}mpeg"
done

ファイル名を小文字に変換するという最初の要件は、実装したいと述べたソリューションでは消えたことに注意してください。

また、この解決策は、実装することを望んでいたことに基づいているため、最初に投稿されたファイルのリストでは機能しないことに注意してください.Aviではなく.aviまたは.AVIで終わるファイルに対してのみ機能するためです。ls *.[Aa][Vv][Ii]必要に応じて修正します。

于 2012-12-10T15:13:02.813 に答える