Bash 仅复制名称与JSON或CSV文件中的值匹配的输入文件夹文件 输入: 包含大量文件的文件夹(具有复杂的文件层次结构) 包含文件名的JSON/CSV文件 输出: 一个新文件夹,其中包含从输入文件夹复制的文件以及CSV/JSON文件中匹配的文件名
我对batch/sed/awk的了解有限,因此欢迎提出任何想法/建议Bash 仅复制名称与JSON或CSV文件中的值匹配的输入文件夹文件 输入: 包含大量文件的文件夹(具有复杂的文件层次结构) 包含文件名的JSON/CSV文件 输出: 一个新文件夹,其中包含从输入文件夹复制的文件以及CSV/JSON文件中匹配的文件名,bash,Bash,我对batch/sed/awk的了解有限,因此欢迎提出任何想法/建议 谢谢大家! 你没有给我们太多的钱,所以我认为 您使用CSV文件 位于源目录的根目录中 格式为file1、file2、… file1只是一个文件名,而不是该文件的完整路径 在这种情况下(这是最简单的情况),您可以尝试以下方法 #!/bin/bash # some renaming for easier read srccsv="$(basename "$1")" srcdir="$(dirname "$1")" trgtd
谢谢大家! 你没有给我们太多的钱,所以我认为
- 您使用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\u csv.sh
注意:它是特定于bash的(因为进程替换),我没有对此进行测试(现在已经很晚了),但我不明白为什么会失败
如果您使用的是JSON输入文件,那么在bash中解析将非常困难。正如@jordanm所指出的,bash/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
循环浏览CSV文件的内容
最简单的方法是使用while
循环和:
对于CSV文件中的每个文件名,比如说hello/world/domination.txt
,您希望最终从/some/source/hello/world/domination.txt
复制到/destination/hello/world/domination.txt
,那么涉及三个步骤:
路径:
FROM="${BASE_PATH}/${FILENAME}"
TO="${DEST_PATH}/${FILENAME}"
dirname
提取目录名,如果目录尚不存在,则使用mkdir-p
递归创建目录:
mkdir -p "$(dirname $TO)"
cp "$FROM" "$TO"
mkdir
和cp
的参数周围的引号确保带空格的路径不被视为单独的参数
请注意,为了简洁起见,我省略了错误检查。在生产脚本中,您通常希望包含检查,以确保源文件存在且可读,并且目标路径可写
把它们放在一起
假设您已经分配了基本路径
和目标路径
:
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
而IFS=','read-r NAME文件名年龄
做
FROM=“${BASE_PATH}/${FILENAME}”
TO=“${DEST_PATH}/${FILENAME}”
mkdir“$(dirname$TO)”
cp“$从“$到”
完成
您能展示一个JSON文件内容的示例吗?建议还是我们应该为您编写代码?对于JSON,bash/sed/awk可能是错误的选择,不需要parsingcut<当IFS='时,代码>读取-r val1 val2 val3;做完成mkdir -p "$(dirname $TO)"
cp "$FROM" "$TO"
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