Bash 仅复制名称与JSON或CSV文件中的值匹配的输入文件夹文件 输入: 包含大量文件的文件夹(具有复杂的文件层次结构) 包含文件名的JSON/CSV文件 输出: 一个新文件夹,其中包含从输入文件夹复制的文件以及CSV/JSON文件中匹配的文件名

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

我对batch/sed/awk的了解有限,因此欢迎提出任何想法/建议


谢谢大家!

你没有给我们太多的钱,所以我认为

  • 您使用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;做完成谢谢jordanm。完全正确。然而,OP已经声明他/她是新的脚本编写者,这是我尝试的一种循序渐进的方法,希望每一部分都有可能转移到未来的任务中。在本例中,它显示了如何迭代任意命令的输出。@jordanm经过一番思考,我同意您的看法,即“正确”的方法可能更具可读性。答案已更新。谢谢你指出这一点。
    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