Всем известна команда ls, выводящая список файлов на консоль. Если требуется вывести только файлы с расширением .iso, то в команду подставляется маска файла: ls *.iso
И все бы хорошо, но команда ls, как и другие команды Linux, любит строгое совпадение регистра имен файлов, т.е. если в каталоге есть файлы с расширением .ISO, .Iso и .iso, то ls *.iso выдаст только те, которые с расширением именно что .iso, и проигнорирует остальные. А вот Windows регистр имен файлов глубоко пофиг, хотя, современные версии Windows и сохраняют регистр в имени файлов. Но для аналогичной линуксовой команде ls команды Windows dir, что .ISO, что .Iso, что .iso — равнозначны, и все командой dir *.iso будут выведены.
Можно воспользоваться мощной командой find, которая умеет игнорировать регистр имен файлов (на самом деле, она кучу всего умеет, см. в источниках):
find <path> -maxdepth 1 -iname <mask>
где:
<path> — путь к каталогу, в котором производится поиск.
-maxdepth 1 — глубина поиска 1 — только в текущем каталоге, без параметра -maxdepth — во всех подкаталогах и ниже.
-iname — игнорировать регистр имени файла.
<mask> — маска файла
Чтобы обрезать полный путь (а find выдает полный путь к файлу(-ам)) до имени, можно воспользоваться командой
basename <path>
где
<path> — полный путь к файлу
Объединить работу двух команд можно с помощью цикла for
Создадим отдельную функцию create_list(), принимающую два параметра — путь к каталогу и маску файла, и выдающую список файлов в переменную $FOUNDLST:
create_list() #$1 - dir, $2 - file mask
{
FOUNDLST=""
for FLE in $(find $1 -maxdepth 1 -iname $2); do
if [ -n "$FLE" ]; then
FOUNDLST="$FOUNDLST"`basename $FLE`"\n"
fi
done
}
DIR1="/home/smallwolfie/test/archives"
DIR2="/home/smallwolfie/test/isos"
...
create_list $DIR1 "*.tar.gz"
if [ -z "$FOUNDLST" ]; then
echo "$DIR1 *.tar.gz not found"
else
TARGZ=$FOUNDLST
fi
create_list $DIR2 "*.iso"
if [ -z "$FOUNDLST" ]; then
echo "$DIR2 *.iso not found"
else
ISO=$FOUNDLST
fi
create_list $DIR2 "*.zip"
if [ -z "$FOUNDLST" ]; then
echo "$DIR2 *.zip not found"
fi
echo "*.tar.gz:"
echo -e -n "$TARGZ"
echo "-----------"
echo "*.iso:"
echo -e -n "$ISO"
Ясно, что в тестовой директории archives должны лежать архивы *.tar.gz, а в isos — образы *.iso
/home/smallwolfie/test/archives *.zip not found
*.tar.gz:
one.tar.gz
two.tar.gz
teSt.Tar.gZ
TEST.TAR.GZ
-----------
*.iso:
lamantin.iso
ariar-01-05-2019-install.ISO
smallwolfie@wolfschanze:~/test$
1. Команда find в Linux Копия
2. basename
3. Цикл for в bash