2015-11-05 2 views
-1
#!/bin/sh 

file_list=`find . -type f` 

IFS=$(echo) #this enables for loop to break on newline 
for file_ in $file_list; do 
    file $file_ 
done 

Этот сценарий оболочки удивительно сообщает об этом (File name too long). Я предполагаю, что скрипт подает file с 3 раза $file_list !!!Почему команда файла в цикле for ведет себя так смешно

Но если я изменю команду file с простым echo, тогда скрипт будет печатать все файлы в текущей строке каталога за строкой, которая ожидается.

+4

Вы устанавливаете 'IFS' для нулевого и отключающего разбиение слов. Таким образом, 'file_' содержит * полный * вывод' find'. Для командной строки это будет слишком долго. 'echo'« работает », потому что новые строки отображают его. Попробуйте использовать 'printf% s '$ file_" 'или' declare -p file_' в цикле и посмотреть, что вы получаете. –

+4

Также см. [Bash FAQ 001] (http://mywiki.wooledge.org/BashFAQ/001) о том, как правильно читать линейные данные из потока. И прочитайте [Не читайте строки для] (http://mywiki.wooledge.org/DontReadLinesWithFor), чтобы понять, почему это плохая идея. –

+2

Возможно, вы использовали 'IFS = $ (echo)' (замена команды, а не расширение параметра). Но это все еще плохая идея. – chepner

ответ

0

Неплохо проецировать результаты find. Используйте его вместо exec:

find -type f -exec file {} \; 
Смежные вопросы