仅复制名称与JSON或CSV文件中的值匹配的输入文件夹文件

时间:2012-08-03 21:27:54

标签: bash

输入:

  • 包含大量文件(具有复杂文件层次结构)的文件夹
  • 包含文件名的JSON / CSV文件

输出:

  • 包含从输入文件夹复制的文件和CSV / JSON文件中匹配文件名的新文件夹

我对batch / sed / awk知之甚少,所以欢迎任何想法/建议。

谢谢!

2 个答案:

答案 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

循环播放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 - 您希望最终从/some/source/hello/world/domination.txt复制到/the/destination/hello/world/domination.txt,然后涉及3个步骤:

  1. 通过附加字符串来创建FROMTO路径:

    FROM="${BASE_PATH}/${FILENAME}"
    TO="${DEST_PATH}/${FILENAME}"
    
  2. 确保目标目录存在。我们使用dirname来提取目录的名称,并使用mkdir -p递归创建目录(如果它们尚不存在):

    mkdir -p "$(dirname $TO)"
    
  3. 执行实际复制

    cp "$FROM" "$TO"
    
  4. 围绕mkdircp的参数的引号确保带有空格的路径不会被视为单独的参数。

    请注意,为简洁起见,我省略了错误检查。在生产脚本中,您通常希望包含检查以确保源文件存在且可读,并且目标路径是可写的。

    把它们放在一起

    假设您已经分配了BASE_PATHDEST_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不是正确的工具。