Linux find exec - 別のディレクトリに出力

Linux find exec - 別のディレクトリに出力

一部のcsvファイルを編集するための短いスクリプトを作成しようとしています。まず、区切り文字を変更してからエンコーディングをUTF-16に変更する必要があります。これを2つの手順で実行して問題が発生した場合に備えて、結果を2つの異なるフォルダに保存したいと思います。

最初のステップ(区切り記号の置き換え)は次のように解決し、かなりうまく機能します。

mkdir ./01_delimiters
find .  -maxdepth 1 -type f -name '*.csv' -exec bash -c 'sed -e "s/|/¦/g" -e "s/╬/|/g" "{}" > ./01_delimiters/"{}"' \;

今、私は01_delimitersフォルダからすべてのファイルをインポートしてエンコーディングを変更し、./02_encodingフォルダに保存したいと思います。私はいくつかのバージョンを試しましたが、うまくいきません。

mkdir ./02_encoding
find ./01_delimiters -maxdepth 1 -type f -name '*.csv' -exec bash -c 'iconv -f utf-8 -t utf-16BE "{}" > ./02_encoding/"{}"' \;

ファイルに問題がないことがわかりましたが、出力に「該当するファイルまたはディレクトリがありません」というエラーが発生します。これを行う方法についてのアイデアはありますか?ところで、私はUbuntuを使っています。よろしくお願いします!

クマ

答え1

{}フルパスに置き換えられます。パスが単なるので、これは最初のコマンドで機能します./file.csv。 2番目のコマンドは名前./01_delimiters/file.csvなので./02_encoding/./01_delimiters/file.csv

あなたはできます

  • mkdir /02_encoding/./01_delimitersをクリックすると、出力ファイルがそのディレクトリに保存されます。
  • 最初のジョブが正しく機能していることを確認したら、2つのジョブを1つにマージします。問題が発生しても元のファイルは削除されませんでした。
  • 2番目のコマンドを次に変更します。

    (cd ./01_delimiters; find . -maxdepth 1 -type f -name '*.csv' -exec bash -c 'iconv -f utf-8 -t utf-16BE "{}" > ../02_encoding/"{}"' \; )
    
  • ただシェルを使う

    for file in *.csv; do
      sed -e "s/|/¦/g" -e "s/╬/|/g" "$file" > "./01_delimiters/$file"
      iconv -f utf-8 -t utf-16BE "./01_delimiters/$file" > "./02_encoding/$file"
    done
    

関連情報