创建路径名来检查文件不存在/ Permission denied错误

时间:2013-11-21 08:54:23

标签: linux bash

来自Linux Bash新手的Hello!

我有一个list.txt,其中包含我要复制到目标的文件列表($ 2)。这些是独特的图像,但其中一些具有相同的文件名。

我的计划是循环遍历文本文件中的每一行,当文件不存在时,将副本发送到目标,并在存在时进行mv重命名。

我遇到的问题是创建路径名来检查文件。在下面的代码中,我只从路径名中获取文件名,我想将其添加到目的地($ 2),中间用“/”来检查文件。

当我运行下面的程序时,我在第9行得到“Permission Denied”,这是我尝试创建路径的地方。

for line in $(cat list.txt)
do
file=$[ basename $line ]
path=$[ $2$file ]
echo $path

if [ ! -f $path ];
then
echo cp $line $2
else
echo mv $line.DUPLICATE $2
fi
done

我是新手,所以感谢我可能会遗漏一些明显的东西,但如果有人可以提供任何建议,我将不胜感激!

2 个答案:

答案 0 :(得分:0)

提交这个,因为OP是BASH脚本中的新功能,尚未发布好的答案。

DESTINATION="$2"

while read -r line; do
  file="${line##*/}"
  path="$2/$file"
  [[ ! -f $path ]] && cp "$line" "$path" || mv "$line" "$path.DUP"
done < list.txt

目前没有计算重复项的逻辑来保持简单。 (这意味着代码将处理一个重复条目)作为替代方案,您事先从uniq获得list.txt以避免重复情况。

答案 1 :(得分:0)

@anubhava:你的脚本看起来不错。这是一个很小的补充,它可以与几个傻瓜一起使用 它为$ path.DUP名称添加了一个数字

UniqueMove()
{
    COUNT=0
    while [ -f "$1" ]
    do 
        (( COUNT++ )) 
        mv -n "$1" "$2$COUNT"
    done
}

while read -r line; do
  file="${line##*/}"
  path="$2/$file"
  [[ ! -f $path ]] && cp "$line" "$path" || UniqueMove "$line" "$path.DUP"
done < list.txt