文件所有权不会在bash脚本中更改

时间:2016-01-25 15:34:16

标签: bash

我试图运行这个脚本,它基本上将上传的文件复制到另一个目录 - 当我运行它时,文件被复制好但是文件的所有权没有像我预期的那样变成sales1upload.dba,而它产生了输出时出现以下错误:

chown:无法访问`test1.txt':没有这样的文件或目录

#!/bin/bash

BASE_DIR="/home/sales1upload/upload"
NEW_BASE_DIR="/bbc/prod/today"
current_time=$(date "+%Y.%m.%d-%H.%M.%S")


for file in $(ls ${BASE_DIR});
 do

filename=${file}
new_filename=$filename.$current_time

#set user permissions as desired
chown sales1upload.dba "$filename"





cp -prf ${BASE_DIR}/${filename} ${NEW_BASE_DIR}/"moved_files"/$new_filename
cp -prf ${BASE_DIR}/${filename} ${NEW_BASE_DIR}
rm  ${BASE_DIR}/${filename}


done

我在脚本中的文件所有权出错了吗?

3 个答案:

答案 0 :(得分:2)

我的快速猜测:你没有在你的Base目录中运行它,因此你不能在chmod参数中指定基数的情况下引用该文件。改为:

chown sales1upload.dba "${BASE_DIR}/${filename}"

我想补充一点,虽然我的问题是解决你问题的直接方法,但正如其他答案建议的那样,摆脱ls就是要走的路。

答案 1 :(得分:1)

您要求ls返回目录中的文件列表,但它们相对于该目录存在,而不是相对于当前目录。

正如评论中所指出的那样,你根本不应该使用ls。将ls修复为简单的通配符也会偶然解决您的问题,但现在您需要重构循环体以应对完整路径而不仅仅是纯文件名。 (你已经在几个地方做了相反的事情,所以这应该是一个简单的错误来解决你自己。)

for file in "$BASE_DIR"/*; do
    filename=$(basename "$file")
    new_filename=$filename.$current_time

    chown sales1upload.dba "$file" 

    cp -prf "$file" "$NEW_BASE_DIR/moved_files/$new_filename"
    cp -prf "$file" "$NEW_BASE_DIR"
    rm  "$file"
done

答案 2 :(得分:1)

使用find而不是ls查找文件。如果您使用find,则表明您拥有正确的路径。在您的示例中,您遍历相对路径而不是绝对路径。