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



我正在尝试使用 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的文件夹应复制到目录PX_A31_smith.adam中。

如果其他三个人在 csv 中也有 190 代码,则190目录也应复制到这些目录中。

编辑2:我解决了语法错误,并且还意识到我有一个未终止的do语句。修复这些问题,似乎仍然在评估if语句时遇到麻烦。更新了以下脚本:

#!/usr/bin/tcsh bash
sed 's/"//g' rename_list.csv | while IFS=, read orig new num; do 
mv "$orig" "$new"
done
echo '1 Done.'
for file in *.pdf; do
mkdir "${file%.*}"
mv "$file" "${file%.*}"
done
echo '2 done.'
sed 's/"//g' rename_list.csv | while IFS=, read orig new num; do 
for folder in * ; do
if [[ .* = "$num" ]]; then
cp -R "$folder" "${file%.*}"
else echo "No matches found."
fi
done
done
echo '3 Done.'

我不确定这是否回答了你的问题,但我认为它至少会让你走上正确的轨道。 在结构上,我只是将所有循环合并为一个。 这消除了一些可能的逻辑错误,这些错误不会被视为语法错误,例如在第二部分中使用$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的操作以在失败时退出。

最新更新