команда find перемещает файлы, но файлы становятся недоступными - PullRequest
0 голосов
/ 16 декабря 2011

Я запустил следующую команду в параметризованной версии скрипта:

Script1 как

Nooffiles=`find $1 -mmin $2 -type f -name "$3"|wc -l`
if test $Nooffiles -eq 0
then
exit 1
else
echo "Successful"
find $1 -mmin $2 -type f -name "$3" -exec mv '{}' $4 \;
fi

Скрипт1 работает нормально.Перемещает файлы из каталога $ 1 в $ 4.Но после того, как он перемещает файлы в новый каталог, мне нужно запустить другой скрипт, например:

Script2 как

for name in `find $1 -type f -name "$2"`
do
filename=`ls $name|xargs -n1 basename`
line=`tail -1 $filename | sed "s/Z/Z|$filename/"`
echo $line >> $3;
echo $filename | xargs -n1 basename;
done

Здесь script2 читает из каталога, куда были перемещены файлыпо предыдущему сценарию, script1.Они существуют в этом каталоге, так как предыдущий сценарий перемещения работал нормально.Команда 'ls' отображает их.Но приведенный выше скрипт2 говорит:

File.txt: No such file or directory

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

Пожалуйста, помогите.

1 Ответ

1 голос
/ 16 декабря 2011

Ваш скрипт действительно беспорядок, и имейте в виду, что вы НИКОГДА не должны анализировать имена файлов (например, вывод из ls или find без опции -print0). См. Подводные камни Bash # 1 .

Кроме того, я думаю, что проблема в том, что в вашем цикле вы усекаете имена файлов, выводимые из find, с помощью basename, но затем вызываете tail с базовым именем файла в качестве аргумента, где файл действительно не является ' t находится в текущей папке.

Я не понимаю, что вы там делаете, но это более правильный код, который, возможно, делает то, что вам нужно:

find "$1" -type f -name "$2" -print0 | while read -d '' name
do
    filename=`basename "$name"`
    tail -1 "$name" | sed "s/Z/Z|$filename/" >> "$3"
    echo "$filename"
done

Но все же в этом сценарии есть подводные камни. Вероятно, произойдет сбой при вводе странных имен файлов из find. Например, если ваше имя файла содержит символы, которые являются специальными для sed. Или если в какой-то момент $filename будет --help и т. Д .etc.etc.

...