2016-01-25 2 views
0

Im пытается запустить этот скрипт, который в основном копирует загруженный файл в другой каталог - при его запуске файл копируется нормально, но право собственности на файл не изменяется на sales1upload.dba как я ожидал, в то время как он производит следующую ошибку на выходе:Владение файлом не меняется в сценарии bash

Чаун: не может получить доступ к `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 

Где я буду неправильно с принадлежностью файла в скрипте ?

+1

Это [бесполезное использование 'ls'] (http://www.iki.fi/era/unix/award.html#ls). Вы хотите просто 'для файла в $ {BASE_DIR}/*'. См. Также http://mywiki.wooledge.org/ParsingLs – tripleee

+0

У вас есть ошибки? – 123

ответ

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 
+0

Да, путь был проблемой .... Спасибо за образование на отдыхе .. – frodo

2

Мое быстрое предположение: вы не используете это в своем базовом каталоге, поэтому вы не можете ссылаться на файл без указания базы в аргументе chmod. Изменить на:

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

Я хотел бы добавить, что хотя мое это простое решение для вашей проблемы, чтобы избавиться от этой ls, как и другие ответы указывают на то, как ехать сюда.

1

Найти файлы с find и не с ls. Если вы используете find, у вас есть правильный путь. В вашем примере вы перебираете относительный путь, а не абсолютный путь.