1

Linuxシェルスクリプト(bash)で次のことを行う方法を探しています:

ランダムな順序で名前が付けられ、サーバー上の共有に配信された一連のファイルがあります。それらはすべて、ファイル内に特定の識別子名が含まれています。

fileabc123.xmlPCVendor
filedef456.xml単語を含む単語を含むPrinterVendor

これらのファイルを適切な方法で処理するには、ファイルの名前をファイル内の単語を含む新しいファイル名に変更する方法/コマンドの組み合わせを見つける必要があります。

fileabc123.xmlに名前を変更するPCVendor-file123abc.xml
filedef456.xml必要があります に名前を変更する必要がありますPrinterVendor-file456def.xml

これは、シェル スクリプト内から自動的に行う必要があります。

私は以下を見ていました:

for i in `ls *.xml`;
do
cat *.xml | grep "PCVendor"
mv $i PCVendor-$i
done

ただし、これにより、各ファイルの名前が対応する単語に変更されるのではなく、使用可能なすべてのファイルの名前が PCVendor-$i に変更されることがわかっています。

よろしくお願いします。

ありがとう、エクォート

4

3 に答える 3

2
for i in $(grep -l Vendor *.xml); do
    echo mv "$i" "$(
        awk '/Vendor/{
            for (i=0; i<=NF; i++) {
                if ($i ~ "Vendor$"){print $i; exit}
            }
        }' "$i")-$i"
done

ノート

  • テストに問題がechoなければ、スクリプトからを削除して実際に実行します
  • スクリプト自体の名前を変更しないように、スクリプトをxmlディレクトリの外に配置します
  • スクリプトは、ベンダーを含む任意の文字列を見つけることができます(スペースまたはタブで区切られている場合は、行の途中でも)
  • スクリプトは、パターンベンダーを含むファイルのみを検索します
  • のような悪い習慣を避けてくださいls *.xml。および、 http://porkmail.org/era/unix/award.htmlcat file | grepを参照してください。
于 2012-11-16T13:58:36.583 に答える
1
shopt -s extglob
for keyword in PCVendor PrinterVendor FruitVendor; do
    grep -l $keyword !(*Vendor-*).xml | xargs -I X mv X $keyword-X
done

拡張グロブ パターンは、名前に「Vendor-」を含まない!(*Vendor-*).xmlすべての xml ファイルを選択します。そのため、grep が調べるファイルの数は、ループの反復ごとに減ります。

于 2012-11-16T16:43:15.767 に答える
1

これは、ファイルを処理する際によくある問題です。最善の解決策は、ファイルを新しいディレクトリに移動し、より適切な/正しい名前を付けることです。

PCVendorDir=../PCVendor
mkdir -p "$PCVendorDir"

for i in *.xml ; do
    if grep -q PCVendor $i ; then
        mv "$i" "$PCVendorDir/PCVendor-$i"
    fi
done

ファイルを別のフォルダーに移動しない場合、スクリプトの次回の実行時に名前PCVendor-file123abc.xmlPCVendor-PCVendor-file123abc.xmlなどに変更されます。

于 2012-11-16T13:51:29.047 に答える