5

私は少しawkfooを学ぼうとしています。各行がpartial_file_name、file_pathの形式であるCSVがあります。私の目標は、(部分的な名前に基づいて)ファイルを見つけて、それぞれの新しいパスに移動することです。これを実現するために、find、awk、およびmvの力を組み合わせたかったのですが、実装に行き詰まっています。
find . -name '*$1*' -print | xargs mv {} $2{}
awkを使用してcsvファイルから用語を分離し、$1と$2がcsvファイルからの分割用語であるようなことを実行できるようにしたかったのです。誰かアイデアはありますか?
-平和

4

4 に答える 4

6

ここでは物事が混同されていると思います。{}検索でのみ使用でき、1回だけ使用できます。つまり、のようなことはできませんfind -name '*.jpg' -exec mv {} {}.png

これを行う:

$ cat korv
foo.txt,/hello/
bar.jpg,/mullo/
$ awk -F, '{print $1 " " $2}' korv
foo.txt /hello/
bar.jpg /mullo/

-Fは区切り文字を設定するため、上記は「、」を使用して分割されます。次に、ファイル名に*を追加します。

$ awk -F, '{print "*"$1"*" " " $2}' korv
*foo.txt* /hello/
*bar.jpg* /mullo/
**

これは、私が空の行を持っていることを示しています。この一致は必要ないため、次のルールを追加します。

$ awk -F, '/[a-z]/{print "*"$1"*" " " $2}' korv
*foo.txt* /hello/
*bar.jpg* /mullo/

見た目が良いので、サブシェルを使用してこれらすべてをmvにカプセル化します。

$ mv $(awk -F, '/[a-z]/{print "*"$1"*" " " $2}' korv)
$

終わり。

于 2011-11-11T06:13:12.457 に答える
1

これには本当にawkは必要ありません。ここには、awkがシェルよりも優れているものは実際にはありません。

#!/bin/sh
IFS=,
while read file target; do
  find . -name "$file" -print0 | xargs -ir0 mv {} "$target"
done <path_to_csv_file

ファイル名に特殊文字が含まれている場合は、を微調整する必要がありますread

于 2011-11-11T13:48:37.890 に答える
0

awkのシステムコマンドを使用するのはどうですか?

awk '{ system("find . -name " $1 " -print | xargs -I {} mv {} " $2 "{}"); }'

csvファイルの引数の例:test.txt ./subdirectory/

于 2011-11-11T05:53:31.497 に答える