#linux #unix
#linux #unix
Вопрос:
Я использую следующую команду, чтобы получить результат подсчета файлов в переменную на основе команды unix «Find»: Критерии: количество файлов, созданных сегодня, с расширением «tab» и размером больше 0 Команда:
num_files_nz=$(find $src_file_path -type f -mtime 0 -name "*.tab" -size 0c | wc -l)
echo "Count of non-0KB files=${num_files_nz}"
Эта команда работает нормально и возвращает количество «4» из командной строки (что правильно), но когда я использую ту же команду и путь к каталогу в сценарии оболочки, количество возвращается как «0».
Я попытался ввести каталог как in $src_file_path
, а затем использовать «.» вместо ввода $src_file_path
непосредственно в команду.
Я заключил все $(find ...)
выражение в кавычки.
Но ничего не работает, он всегда возвращает 0 при использовании в сценарии оболочки.
Я был бы очень признателен, если кто-нибудь может помочь мне решить эту проблему.
Ниже приведен сценарий:
#export path=/newitest/u01/app/itestcomn/admin/out/itest_eca1db11
#!/usr/bin/ --
request_id=$5
hostname=$6
username=$7
password=$8
email_to=${9}
org_code=${10}
dest_file_path="/$org_code"
RETCODE=0
echo "Main Request ID=$request_id"
echo "hostname=$hostname"
echo "username=$username"
echo "password=$password"
echo "email_to=$email_to"
echo "dest_file_path=$dest_file_path"
echo "org_code=$org_code"
cd $XXKE_TOP/../../keedi/11.5.0/outbound/"$org_code"
src_file_path="$(pwd)"
ls -l
echo "src_file_path=$src_file_path"
#number of files created today, with extension "tab" and size greater than 0
num_files_nz=$(find $src_file_path -type f -mtime 0 -name "*.tab" -size 0c | wc -l)
echo "Count of non-0KB files=${num_files_nz}"
#number of files created today, with name "StockTransfer_Oracle.tab" and size equals 0
num_files_z=$(find $src_file_path -type f -mtime 0 -name "StockTransfer_Oracle.tab" -size 0c | wc -l)
echo "Count of 0KB files=${num_files_z}"
#total file count
num_tot_files=$(expr "$num_files_nz" "$num_files_z")
echo "Total file count=${num_tot_files}"
if [ "$num_tot_files" -eq 14 ];
then
echo "FTP Start"
ftp -v -n $hostname <<EOF
quote USER $username
quote PASS $password
cd /
cd $dest_file_path
pwd
prompt off
mput *.tab
bye
EOF
else
echo "ERROR GENERATING EXTRACTS"
#Extract files with zero size other than the file "StockTransfer_Oracle.tab"
err_files="$(find $src_file_path -type f -mtime 0 -name "*.tab" ! -name "StockTransfer_Oracle.tab" -size 0c)"
echo "Error Ertracts"
echo "${err_files}"
msg_body="Following $org_code extracts were not completely generated:nn$err_files"
echo ${msg_body} | mailx -s "ERROR: Extract File Generation" ${email_to}
fi
Я вхожу в исходный каталог с помощью команды «cd» в строке 18, я использую тот же путь, что и значение в переменной $ src_file_path, и тот же путь должен быть доступен, когда я использую «.» в инструкции find.
Я изучу абсолютный путь, но, пожалуйста, пришлите несколько примеров, если это возможно, и любые другие предложения, которые могут помочь заставить сценарий оболочки работать.
Также, когда я создаю файл «.sh» и выполняю его из командной строки, команда find работает и возвращает правильное количество, но когда я преобразую его в «.prog» и запускаю его с помощью параллельной программы, команда возвращает нулевое количество
Спасибо Anir
Комментарии:
1. Здравствуйте. Я пробовал, как вы описали. Но я получаю правильный ответ (для меня это: количество файлов, отличных от 0 КБ = 1), независимо от того, запускаю ли я его в командной строке или в файле сценария оболочки. Итак, я хочу знать ваш точный сценарий оболочки.
2. И в каком каталоге вы запускаете файл сценария оболочки, когда используете «.» вместо ввода $src_file_path ? А вы пробовали использовать абсолютный путь?
3. Если у вас
src_file_path
есть пробелы, вы должны заключить его в кавычки, т.е.$(find "$src_file_path" ...)
Ответ №1:
Это не сработает.
cd $ XXKE_TOP/../../keedi/11.5.0/outbound/»$org_code» src_file_path=»$ (pwd)»
Вместо этого я предлагаю вам указать, как показано ниже, и это должно быть исправлено:
экспорт src_file_path=$XXKE_TOP/../../keedi/11.5.0/исходящий/»$org_code»