入力:
- たくさんのファイルを含むフォルダー (複雑なファイル階層を持つ)
- ファイル名を含む JSON/CSV ファイル
出力:
- 入力フォルダーからコピーされたファイルと、CSV/JSON ファイル内の一致するファイル名を含む新しいフォルダー
私はバッチ/sed/awkの知識が限られているので、アイデア/提案は大歓迎です。
ありがとうございました!
私はバッチ/sed/awkの知識が限られているので、アイデア/提案は大歓迎です。
ありがとうございました!
上記のコメントで述べたように、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
最も簡単な方法は、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
文字列を追加してFROM
、パスを作成します。TO
FROM="${BASE_PATH}/${FILENAME}"
TO="${DEST_PATH}/${FILENAME}"
宛先ディレクトリが存在することを確認してください。dirname
ディレクトリの名前を抽出し、ディレクトリmkdir -p
がまだ存在しない場合は再帰的に作成するために使用します。
mkdir -p "$(dirname $TO)"
実際のコピーを実行します
cp "$FROM" "$TO"
の引数を引用符で囲み、スペースを含むパスが個別の引数として扱わmkdir
れcp
ないようにします。
簡潔にするために、エラーチェックを省略していることに注意してください。実稼働スクリプトでは、通常、ソースファイルが存在し、読み取り可能であり、宛先パスが書き込み可能であることを確認するためのチェックを含める必要があります。
あなたがすでに割り当てていると仮定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
あなたは私たちが続けるために多くを与えてくれなかったので、私はそれを仮定します
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 は適切なツールではありません。