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

В настоящее время у меня есть каталог /mydir , и внутри должно быть 1000 файлов данных в форме File1.exe, File2.exe, ... , File100.exe .

В настоящее время у меня есть цикл for, который ищет и выводит, какие файлы отсутствуют:

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

Мне интересно, есть ли какой-нибудь способ вместо отображения отсутствующего индекса поместить его в список через запятую, например:

1,5,20,40,etc . Д.

Есть ли способ сделать это?

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

 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 

Использование /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 в качестве разделителя (по умолчанию пробел). Подshell устанавливает IFS в запятую, а затем печатает массив, объединенный запятыми. Подshell не позволяет переменной IFS быть установленной в оставшейся части скрипта.

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

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

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

Объяснение:

вставить - объединить строки файлов
вставить [ОПЦИЯ] ... [ФАЙЛ] ...
Без ФАЙЛА, или когда ФАЙЛ - -, читайте стандартный ввод.

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