-3

入力:

  • たくさんのファイルを含むフォルダー (複雑なファイル階層を持つ)
  • ファイル名を含む JSON/CSV ファイル

出力:

  • 入力フォルダーからコピーされたファイルと、CSV/JSON ファイル内の一致するファイル名を含む新しいフォルダー

私はバッチ/sed/awkの知識が限られているので、アイデア/提案は大歓迎です。

ありがとうございました!

4

2 に答える 2

2

上記のコメントで述べたように、bash / sed/awkはJSONの解析には理想的ではありません。CSVがオプションであるとほのめかしたので、それが最善の策だと思います。

これが課題であるかどうかはわかりませんが、何を試みたかについてはまだ言及していないため、完全なスクリプトを作成することは控えます。代わりに、ここにコアビットの簡単な概要があります。これはうまくいけば転送に役立ちます。

また、入力ファイルの例を提供していないので、作成します。次のような入力CSVファイルがあるとします。

$ cat in.csv
john,hello/world/domination.txt,10
ruth,some_file.txt,20
sarah,jessica/parker.jpg,80

CSVファイルの内容をループする

最も簡単な方法は、whileループを使用してread

$ while IFS=',' read -r NAME FILENAME AGE; do echo "$FILENAME"; done < in.csv
hello/world/domination.txt
some_file.txt
jessica/parker.jpg
in/my documents/empty.file

IFS入力CSV行をフィールドに分割するために、一時的に(内部ファイル区切り文字)をコンマに変更したことに注意してください。

コピーコマンド

スクリプトにベースパス( 「...フォルダに多数のファイルが含まれている(複雑なファイル階層を持つ)」)と宛先ディレクトリがあり、次のようになっていると仮定します。

BASE_PATH="/some/source/"
DEST_PATH="/the/destination/"

そして、CSVファイルのファイル名ごとに(たとえば、からにhello/world/domination.txtコピーすることになります)、次の3つの手順が必要になります。/some/source/hello/world/domination.txt/the/destination/hello/world/domination.txt

  1. 文字列を追加してFROM、パスを作成します。TO

    FROM="${BASE_PATH}/${FILENAME}"
    TO="${DEST_PATH}/${FILENAME}"
    
  2. 宛先ディレクトリが存在することを確認してください。dirnameディレクトリの名前を抽出し、ディレクトリmkdir -pがまだ存在しない場合は再帰的に作成するために使用します。

    mkdir -p "$(dirname $TO)"
    
  3. 実際のコピーを実行します

    cp "$FROM" "$TO"
    

の引数を引用符で囲み、スペースを含むパスが個別の引数として扱わmkdircpないようにします。

簡潔にするために、エラーチェックを省略していることに注意してください。実稼働スクリプトでは、通常、ソースファイルが存在し、読み取り可能であり、宛先パスが書き込み可能であることを確認するためのチェックを含める必要があります。

すべてを一緒に入れて

あなたがすでに割り当てていると仮定BASE_PATHしてDEST_PATH

while IFS=',' read -r NAME FILENAME AGE
do
    FROM="${BASE_PATH}/${FILENAME}"
    TO="${DEST_PATH}/${FILENAME}"
    mkdir "$(dirname $TO)"
    cp "$FROM" "$TO"
done < in.csv
于 2012-08-03T22:43:42.183 に答える
1

あなたは私たちが続けるために多くを与えてくれなかったので、私はそれを仮定します

  • CSV ファイルを使用する

  • ソースディレクトリのルートにある

  • 次のようにフォーマットされますfile1,file2,...

  • これfile1単なるファイル名であり、そのファイルへのフル パスではありません。

その場合(最も単純なケース)、次のようなものを試すことができます

#!/bin/bash

# some renaming for easier read
srccsv="$(basename "$1")"
srcdir="$(dirname "$1")"
trgtdir="$2"

# perform the copy
set +o posix
cp <(IFS=,; \
    while read filename; do \
        find "$srcdir" -type f -name "$filename" -print0; \
    done < "$srccsv") "$trgtdir"

次に、経由で実行します

./cp_csv.sh path/to/your/csv path/to/your/targetdir

このスクリプトに名前を付けたとしますcp_csv.sh

注:これはbash固有のもので(プロセス置換のため)、テストしていません(ここでは非常に遅いです..)が、なぜこれが失敗するのかわかりません。

JSON 入力ファイルを使用している場合、bash で解析するのははるかに面倒です。@jordanm が示すように、bash/sed/awk は適切なツールではありません。

于 2012-08-03T22:40:49.007 に答える