Невозможно указать имя файла с пробелом
Я очень новичок в написании сценариев оболочки и написание сценария для проекта. У меня проблема при выполнении "stat" для имени файла, чтобы проверить размер, в котором есть пробелы. Проблема в том, что я не могу написать команду напрямую, и сначала я должен сохранить ее в переменной, а затем выполнить ее через эту переменную. Например, мой скрипт:
##test.sh
###Start
OIFS=$IFS
IFS=$'\n'
filename=$1
a=stat
b=-c
c=%s
d=${filename}
CMD="$a $b $c $d"
result=`$CMD`
echo "Size is:"$result
IFS=$OIFS
###END
Я установил IFS=$'\n', чтобы передать имя файла с пробелом в качестве параметра. когда я выполняю это, тогда я получаю:
[root@abhargava ~]# ./test.sh dirLevel1/file\ Level1.txt
./test.sh: line 9: stat -c %s dirLevel1/file Level1.txt: No such file or directory
Size is:
Из-за IFS я думаю, что shell рассматривает команду как единое целое, не разбивая ее на части, и если я удаляю эту настройку IFS, то она говорит:
[root@abhargava ~]# ./test.sh dirLevel1/file\ Level1.txt
stat: cannot stat `dirLevel1/file': No such file or directory
stat: cannot stat `Level1.txt': No such file or directory
Size is:
Поэтому он обрабатывает параметр как два разных файла. Я не могу использовать "$@" также потому, что получаю имя файла из какой-то другой логики перечисления файлов в каталоге, например
for i in 'find ${arg} -type f'
do
calling the test.sh
done
Пожалуйста, помогите мне как можно скорее..!! Заранее спасибо....!!
3 ответа
Я согласен с Игнасио: лучше всего придерживаться простых сценариев Bash. Исходя из этого, я упростил скрипт, чтобы он мог работать с пробелами. Чтобы позволить ему обрабатывать пробелы, включение имени файла в кавычки позволило скрипту иметь дело с пробелами в имени файла.
##test.sh
###Start
result=`stat -c %s "$1"`
echo "Size is:"$result
###END
Я понимаю, что это старая тема, но я нашел хорошую статью, которая решает эту проблему, когда вы передаете имя файла в stat. А именно, вам нужно использовать xargs вместе с флагом -d (для разделителя), чтобы указать другой разделитель, ДРУГОЙ, кроме пробелов. Когда я указываю своим разделителем новую строку '\n', у меня это работает!
Кредит принадлежит этой статье: https://shapeshed.com/unix-xargs/