Весь цикл while
имеет стандартный перенаправленный вход.Любой read
будет использовать одну строку ввода из find
вместо терминала пользователя.
Многократное выполнение одной и той же команды find
во внешнем цикле в любом случае ужасно неэффективно.Вероятно, соберите результаты двух команд find
в два массива, а затем просто зацикливайте строки в памяти вместо того, чтобы крутить диск по одним и тем же каталогам снова и снова.
Однако, если вы пытаетесь найтифайлы вне 1
, которые идентичны файлам в 1
с тем же именем, гораздо более эффективный подход состоит в том, чтобы запустить
find . -name '*.xyz' -exec shasum {} +
, а затем обработать итоговый вывод в простом сценарии Awk.Возможно, что-то вроде этого:
#!/bin/bash
find . -name '*.xyz' -exec shasum {} + |
# Reverse each line, sort by first field, reverse again
# Entries for files with the same basename will now be adjacent
rev | sort -t / -k1,1 | rev |
awk -F / '$NF!=p { p=$NF; delete a; c=""; }
{ split($0, x, /[ \t]+/);
if(x[2] ~ /^\.\/1\//) {
if (a[x[1]]) print a[x[1]];
c = x[1];
next
}
if (c) {
if (x[1] == c) print x[2];
next;
}
a[x[1]] = x[2] (a[x[1]] ? ORS a[x[1]] : ""); }'