2011-01-21 4 views
0

シェルスクリプトに関する質問を再度投稿します。シェルスクリプト:ファイルに対してcmdを実行し、ファイル名を追加処理します

問題定義:ディレクトリ下のすべてのファイルについては、例:

  • A_anything.txt、B_anything.txt、......

私が実行したいですスクリプト、のような名前の出力ファイルを使用して、それらのそれぞれに、 'CMD' を言う:

  • をA_result.txt、B_result.txt、......
  • また210

は、これらの出力ファイルの最初の行で、私は、元の1のファイル名を持っていると思います。

'find -exec'ユーティリティがファイル名の一部を抽出できないようです。

誰かがこの問題の解決方法を(シェル、パイソン、検索など)知っていますか?ありがとうございました!

答えて

2
cd /directory 
for file in *.txt ; do 
    newfilename=`echo "$file"|sed 's/\(.\+\)_.*/\1_result.txt/` 
    echo "$file" > "$newfilename" 
    your-command $file >> "$newfilename" 
done 

HTH

+1

+1にもかかわらず、それに続く。おそらく、 'for.txt'や' for-'行の' [A-Z] _ *。txt'であっても構いませんが、ファイルがすべて単一のディレクトリにある場合には動作します。 'your-command'行にはおそらく' '$ files ''も必要です。複数の '$ files'ではなく、' $ file'という単数形の名前を使用します。これは、一度に複数のファイル名ではなく単一のファイル名を含むからです。 –

+0

あなたは正しいです。修正されました。 +1 –

+0

ありがとうございますが、HTHは何ですか? – lukmac

1

まあ、それを行うには複数の方法は、(それがモットーだPerlを、使用することを含む)がありますが、おそらく私はこのようにそれを記述します

find . -name '[A-Z]_*.txt' -type f -print0 | 
    xargs -0 modify_rename.sh 

をこのseparatioの

#!/bin/sh 
for file in "[email protected]" 
do 
    dirname=$(dirname "$file") 
    basename=$(basename "$file" .txt) 
    leadname=${file%_*} 
    outname="$dirname/${leadname}_result.txt" 
    # Optionally check for pre-existence of $outname 
    { 
    # Optionally echo "$basename.txt" instead of "$file" 
    echo "$file" 
    # Does this invocation of CMD write to standard output? 
    # If not, adjust invocation appropriately. 
    CMD "$file" 
    } > "$outname" 
done 

利点:そして、私はこのようなスクリプトmodify_rename.shを記述します。 nを別のスクリプティング操作に使用することは、リネーム/変更操作を検索プロセスとは別にチェックアウトできるため、不正なコマンドでディレクトリ構造全体をザッピングする危険性が少なくなります。

Bashには、basenamedirnameを呼び出さないようにするツールがありますが、表記法はかなり苦労しています。私は持っている価値のあるコマンド名の明快さを見つける。もしbashが組み込み関数として実装したら、私はうれしいでしょう。ファイルの接頭辞を取得するには他にもたくさんの方法があります。ただし、二重引用符を慎重に使用するため、ファイルやディレクトリ名のスペース(タブ、改行)があっても安全です。

+0

という表記法が賢明です。構文に慣れれば簡単になります。 – ghostdog74

+0

@ ghostdog74:そして私は25年以上前にベースネームとdirnameの表記法を学んだので、彼らは簡単で完全にわかりやすくなりました。そして最近は新しく幻想的な表記法(15歳ですが、すべてのシェルで利用可能ではありませんでした)明確ではありません。だから、私は自分の好みの方言に固執し、若者は代替方言を好む傾向があり、したがってTMTWTDIを指摘するだろうということを認識しています。 –

+0

良い戦略、共有ありがとう! – lukmac

関連する問題