解析CSV以查找与代码对应的名称,然后将具有匹配代码的文件夹复制到具有相应名称的文件夹

时间:2018-06-14 16:04:14

标签: bash shell unix scripting

我尝试使用bash脚本自动打包各种来源的文件和内容。

我有一个主目录,其中包含pdf个文件,一个csv文件以及包含其他内容的各种文件夹。文件夹以它们所属的位置代码命名,例如, 190191

我的csv文件中的典型行如下所示:form_letters_Part1.pdf,PX_A31_smith.adam.pdf,190,

第一列是原始pdf名称,第二列是它将被重命名的名称,第三列是该人所属的位置代码。

我的脚本的第一部分将pdf文件从求职信格式重命名为PX_A31...格式,然后为每个文件创建一个目录并将其移入其中。

#!/usr/bin/tcsh bash
sed 's/"//g' rename_list_lab.csv | while IFS=, read orig new num; do 
    mv "$orig" "$new"
done
echo 'Rename  Done.'
for file in *.pdf; do
    mkdir "${file%.*}"
    mv "$file" "${file%.*}"
done
echo 'Directory creation done.'

接下来需要做的是将具有特定位置内容的文件夹复制到刚刚创建的新目录中,对应于csv文件中的位置代码。

所以我在上面的echo 'Directory Creation Done.'行之后尝试了这个:

echo 'Directory Creation Done.'
sed 's/"//g' rename_list.csv | while IFS=, read orig new num; do 
    for folder in *; do
        if [[ -d .* = "$num" ]]; then
            cp -R "$folder" "${file%.*}"
        fi
done
echo 'Code Folder Contents Sort Done.'

然而,这会导致语法错误:

syntax error in conditional expression
syntax error near `='
`                    if [[ -d .* = "$num" ]]; then'

编辑:为了澄清第二部分if语句,语句的预期逻辑如下:对于当前目录中的项目,如果它是目录,并且目录的名称与该位置匹配来自csv的代码,该目录应该被复制到csv中具有相同对应位置代码的任何目录。

换句话说,如果第一部分中新创建的目录是PX_A31_smith.adam,其上面的csv行中的位置代码是190,那么应该将名为190的文件夹复制到目录{{ 1}}。

如果其他三个人在csv中也有190个代码,那么PX_A31_smith.adam目录也应该复制到那些。

编辑2:我解决了语法错误,并且还意识到我有一个非终止的190语句。修复这些问题,似乎仍然无法评估do语句。更新了下面的脚本:

if

1 个答案:

答案 0 :(得分:1)

我不确定这是否能回答你的问题,但我认为这至少会让你走上正轨。在结构上,我只是把所有的循环合二为一。这消除了一些可能的逻辑错误,这些错误不会被视为语法错误,例如在第二部分中使用$file。这是第一部分循环的局部变量,不再存在。但是,这将被解释为空字符串。

#!/usr/bin/bash
#^Fixed shebang line.

sed 's/"//g' rename_list.csv | while IFS=, read -r orig new num; do 

    if [[ -f $orig ]]; then          #If the file we want to rename is indeed a file.
        mkdir "${new%.*}"            #make the directory from the file name you want
        mv "$orig" "${new%.*}/$new"  #Rename when we move the file into the new directory

        if [[ -d $num ]]; then       #If the number directory exists
            cp -R "$num" "${new%.*}" #Fixed this based on your edit.
        else
            #Here you can handle what to do if the number directory does not exist.
            echo "$num is not a directory."
        fi

    else  
        #Here you can handle what to do if the file does not exist.
        echo "The file $orig does not exist."
    fi

done

根据您的澄清编辑

注意:就错误检查而言,这是非常缺乏的。请记住,任何这些功能都可能失败,这会产生不必要的行为。检查if [[ $? != 0 ]]以检查上次发出的命令的退出状态(0表示成功)。您还可以执行mkdir somedir || exit 2之类的操作,以便在失败时退出。