Как вытащить разделенный запятыми индексный список всех отсутствующих файлов внутри каталога?

Я считаю, что сборка в chroot проверит, что все вспомогательные файлы и программы для сборки GCC и GlibC присутствует и не зависит от «системы сборки». Обычно компиляция компилятора совсем не проста. Я считаю, что GCC потребует bison и flex и всевозможные файлы заголовков, файлы конфигурации и бог знает что еще. Сборка chroot - это просто промежуточный шаг между системой сборки (которая не является LFS) и окончательной установкой LFS, которая должна быть самостоятельной.

Поскольку среда выполнения GCC сложна ( PATH , LD_LIBRARY_PATH и другие элементы конфигурации), также возможно, что некоторые побочные эффекты будут просачиваться из исходного компилятора GCC. Я не могу найти эту статью, но помню, что может потребоваться до 5 поколений компиляции компилятора с ранее скомпилированным поколением, чтобы выявить все странные ошибки и зависимости.

0
25.06.2018, 13:25
3 ответа

Просто используйте для строки, разделенной запятыми, продолжайте добавлять индекс ваших файлов к переменной и распечатывайте переменную

for((i=1; i<=30; i++))
do
    name="File${i}.exe"; [[ ! -e "$name" ]] && files="$files$i,"
done
echo $files | sed  s/,$//

Или вы можете сохранить значения в массиве/списке

arr=()
for((i=1; i<=30; i++))
do
    name="File${i}.exe"; [[ ! -e "$name" ]] && arr+=($i)
done
(IFS=, ; echo "${arr[*]}") #to print the array with comma as separator 
3
28.01.2020, 02:15

Использование /bin/shи списка позиционных параметров для хранения имен отсутствующих файлов:

set --
i=1
while [ "$i" -le 1000 ]; do
    name="File.$i.exe"
    [[ ! -e "$name" ]] && set -- "$@" "$name"
    i=$(( i + 1 ))
done

( IFS=','; printf 'Missing files: %s\n' "$*" )

или используя bashи массив:

missing=()
for (( i=1; i<=1000; ++i )); do
    name="File.$i.exe"
    [[ ! -e "$name" ]] && missing+=( "$name" )
done

( IFS=','; printf 'Missing files: %s\n' "${missing[*]}" )

При использовании "$*"или "${missing[*]}"массив будет преобразован в строку. Строка будет объединена с первым символом $IFSв качестве разделителя (по умолчанию пробел ). Подоболочка устанавливает IFSв запятую, а затем печатает массив, соединенный запятыми. Подоболочка предотвращает установку переменной IFSв остальной части скрипта.

Код также сможет работать с именами файлов, содержащими пробелы и т. д.

2
28.01.2020, 02:15

Используйте инструмент paste, просто добавьте | paste -sd,в цикл:

for((i=1; i<=1000; i++))
do 
    name="File.${i}.exe"; [[ ! -e "$name" ]] && echo "$i" 
done | paste -sd,

Пояснение:

paste - merge lines of files
paste [OPTION]... [FILE]...
With no FILE, or when FILE is -, read standard input.

  • -s:вставлять по одному файлу вместо параллельного
  • -d:разделитель(,в данном случае)
1
28.01.2020, 02:15

Теги

Похожие вопросы