Вот более «краткий» и лаконичный подход:
#!/bin/bash
## Read the UUIDs into the array 'uuids'. Using awk
## lets us both skip comments and only keep the UUID
mapfile -t uuids < <(awk '!/^\s*#/{print $1}' uuids.txt)
## Iterate over each UUID
for uuid in ${uuids[@]}; do
## Set the special array $_ (the positional parameters: $1, $2 etc)
## to the glob matching the UUID. This will be all file/directory
## names that start with this UUID.
set -- "${source_directory}"/"${uuid}"*
## If no files matched the glob, no file named $1 will exist
[[ -e "$1" ]] && echo "YES : $1" || echo "PANIC $uuid"
done
Обратите внимание, что, хотя вышесказанное довольно красиво и отлично работает для нескольких файлов, его скорость зависит от количества UUID и будет очень медленно, если вам нужно обрабатывать многие. Если это так, используйте либо решение @ choroba или, для чего-то действительно быстрого, избегайте оболочки и вызывайте perl:
#!/bin/bash
source_directory="."
perl -lne 'BEGIN{
opendir(D,"'"$source_directory"'");
foreach(readdir(D)){ /((.+?)_.*)/; $f{$2}=$1; }
}
s/\s.*//; $f{$_} ? print "YES: $f{$_}" : print "PANIC: $_"' uuids.txt
. Чтобы проиллюстрировать разницу во времени, я опробовал свой подход bash, choroba и my perl в файле с 20000 UUID, из которых 18001 имеет соответствующее имя файла. Обратите внимание, что каждый тест выполнялся путем перенаправления вывода скрипта на /dev/null.
My bash (~ 3.5 min)real 3m39.775s
user 1m26.083s
sys 2m13.400s
Choroba's (bash, ~ 0.7 sec) real 0m0.732s
user 0m0.697s
sys 0m0.037s
My perl (~ 0,1 с ): real 0m0.100s
user 0m0.093s
sys 0m0.013s
Нашел:
Для изображений CentOS: lxc exec my-container -- bash Для изображений Ubuntu: lxc shell my-container или для изображений Ubuntu: lxc exec my-container -- sudo --login --user usernameНашел:
Для изображений CentOS: lxc exec my-container -- bash Для изображений Ubuntu: lxc shell my-container или для изображений Ubuntu: lxc exec my-container -- sudo --login --user username