我对batch / sed / awk知之甚少,所以欢迎任何想法/建议。
谢谢!
答案 0 :(得分: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
最简单的方法是使用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
- 您希望最终从/some/source/hello/world/domination.txt
复制到/the/destination/hello/world/domination.txt
,然后涉及3个步骤:
通过附加字符串来创建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
答案 1 :(得分: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不是正确的工具。