我试图运行这个脚本,它基本上将上传的文件复制到另一个目录 - 当我运行它时,文件被复制好但是文件的所有权没有像我预期的那样变成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
我在脚本中的文件所有权出错了吗?
答案 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
,则表明您拥有正确的路径。在您的示例中,您遍历相对路径而不是绝对路径。