Проблема была в том, :что я идиот.
На самом деле аппаратное обеспечение — это Azulle Inspire, а вовсе не NUC. Я бы хотел, чтобы производители наклеили одинаковые этикетки на этот лабиринт извилистых маленьких черных коробочек.
Чтобы войти в BIOS на одном из них, несколько раз нажмите DEL.
Я до сих пор не знаю, как вывести 8-канальный звук через порт HDMI, но это уже другой вопрос.
Вы можете попробовать это, если ваши имена файлов не содержат табуляции или новой строки:
find. -type f -print |
awk '
NR==FNR {
name2ids[$3][1] = $1
name2ids[$3][2] = $2
next
}
{
for (name in name2ids) {
if ( index($NF,name) ) {
matches[name][$0]
}
}
}
END {
for (name in name2ids) {
print "ID1 =", name2ids[name][1]
print "ID2 =", name2ids[name][2]
print "\nPath:"
if (name in matches) {
for (file in matches[name]) {
print file
}
}
}
}
' FS='\t' SearchList.txt FS='/' -
В приведенном выше примере используется GNU awk для массивов массивов, здесь версия POSIX (не проверена):
find. -type f -print |
awk '
NR==FNR {
name2ids[$3] = $1 RS $2
next
}
{
for (name in name2ids) {
if ( index($NF,name) ) {
matches[name] = (name in matches ? matches[name] RS : "") $0
}
}
}
END {
for (name in name2ids) {
split(name2ids[name],ids,RS)
print "ID1 =", ids[1]
print "ID2 =", ids[2]
print "\nPath:"
split(matches[name],files,RS)
for (idx in files) {
print files[idx]
}
}
}
' FS='\t' SearchList.txt FS='/' -
Проверка вашего кода bash:
read
может подобрать вам слова $(...)
вместо`...`
-ссылкаwhile read -r var1 var2 var3 rest; do
printf "\n ID1 = %s \n ID2 = %s \n\n Path:\n" "$var1" "$var2"
find //myDirectory/ -type f -name "*$var3*" -not -path '*/zz_masters/*' -exec ls -Sd {} +
#........................ quoted ^.......^
printf "\n----------------------\n";
done < /SearchList.txt > /ResultList.txt
Однако способ ускорить это — запустить find
только один раз:
id1=()
id2=()
substrings=()
names=( -false )
declare -A paths=()
while read -r var1 var2 var3 rest; do
id1+=( "$var1" )
id2+=( "$var2" )
substrings+=( "*$var3*" )
names+=( -o -name "*$var3*" )
done < /SearchList.txt
find /myDirectory/ -type f \( "${names[@]}" \) -not -path '*/zz_masters/*' -prinf "%s %p\0" \
| sort -znr \
| while read -d '' -r size name; do
for s in "${substrings[@]}"; do
if [[ $name == *"$s"* ]]; then
paths[$s]+="$name"$'\n'
break
fi
done
done
fmt="\n ID1 = %s \n ID2 = %s \n\n Path:\n%s\n----------------------\n"
for idx in "${!id1[@]}"; do
printf "$fmt" "${id1[idx]}" "${id2[idx]}" "${paths[${substrings[idx]}]}"
done > /ResultList.txt