Невозможно указать имя файла с пробелом

Я очень новичок в написании сценариев оболочки и написание сценария для проекта. У меня проблема при выполнении "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/

Другие вопросы по тегам