1

このコマンドは、ファイルの名前を変更します。

$ find $PWD -name "*.jpg" | awk '{c=$0; gsub("/", "_", c)}{system("mv -v " $0 " " c)}'
`/home/pic/Pulpit/test/stary/1.jpg' -> `_home_pic_Pulpit_test_stary_1.jpg'

私はテストファイルを持っています:

$ ls 
`[~!($%^_&*){.}\___"`]`1.jpg

........。

 $ find -not -name .
 ./`[~!($%^_&*){.}\___"`]`1.jpg

ファイル名を変更したい:

$ find -not -name . | awk '{c=$0; gsub("/", "_", c)}{system("mv -v " $0 " " c)}'
/bin/sh: Syntax error: word unexpected (expecting ")")

が欲しいです:

_home_pic_Pulpit_test_stary_`[~!($%^_&*){.}\___"`]`1.jpg

ご協力ありがとうございました。

編集:

これは「gawk」では機能しますが、「mawk」では機能しません。

gawk(作品):

$ find -not -name . | gawk '{ 
>     c=$0; 
>     gsub( "/", "_", c ); 
>     c = gensub( /([[:punct:]])/, "\\\\&", "g", c ); 
>     $0 = gensub( /([[:punct:]])/, "\\\\&", "g", $0 ); 
>     system("echo mv -v " $0 " " c)}
> '
mv -v ./`[~!($%^_&*){.}\___"`]`1.jpg ._`[~!($%^_&*){.}\___"`]`1.jpg

mawk(動作しません):

$ find -not -name . | mawk '{ 
>     c=$0; 
>     gsub( "/", "_", c ); 
>     c = gensub( /([[:punct:]])/, "\\\\&", "g", c ); 
>     $0 = gensub( /([[:punct:]])/, "\\\\&", "g", $0 ); 
>     system("echo mv -v " $0 " " c)}
> '
mawk: line 8: function gensub never defined
mawk: line 8: function gensub never defined

gawk(作品):

$ find -not -name . | gawk '{
>     gsub( /[[:punct:]]/, "\\\\&" ); 
>     c = $0; 
>     gsub( /\//, "_", c ); 
>     system( "echo mv -v " $0 " " c ) }
> '
mv -v ./`[~!($%^_&*){.}\___"`]`1.jpg ._`[~!($%^_&*){.}\___"`]`1.jpg

mawk(動作しません):

$ find -not -name . | mawk '{
>     gsub( /[[:punct:]]/, "\\\\&" ); 
>     c = $0; 
>     gsub( /\//, "_", c ); 
>     system( "echo mv -v " $0 " " c ) }
> '
/bin/sh: Syntax error: word unexpected (expecting ")")

Ubuntu 10.10を使用していて、「mawk」をインストールしました。

'mawk'でそれを行う方法は?

編集-1:

別のフォーラムで、mawkの解決策を入手しました。

find $PWD -name "*.jpg" | mawk 'a=$0{gsub("/", "_")}{system("mv -v '"'"'" a "'"'"' '"'"'" $0 "'"'"'")}'
4

1 に答える 1

1

を使用する1つの方法GNU awk。コマンドを実行する前に、すべての句読文字をエスケープしますmv

find -not -name . | awk '{ 
    c=$0; 
    gsub( "/", "_", c ); 
    c = gensub( /([[:punct:]])/, "\\\\&", "g", c ); 
    $0 = gensub( /([[:punct:]])/, "\\\\&", "g", $0 ); 
    system("mv -v " $0 " " c)}
'

awk互換性のあるコマンドを追加するための更新:

find -not -name . | awk '{
    gsub( /[[:punct:]]/, "\\\\&" ); 
    c = $0; 
    gsub( /\//, "_", c ); 
    system( "mv -v " $0 " " c ) }
'
于 2012-05-02T08:58:34.917 に答える