com xargs
+ find
Uma solução é usar xargs
para criar comandos insanamente longos em find
que pesquisarão milhares de arquivos de uma só vez:
sed -e 's/^/-o -name /' "${Region}_${date}.txt" \
| xargs find "$DataDir" -false \
> "${runDir}/st_$Region"
O primeiro comando sed
transforma cada nome de arquivo na expressão -o -name filename
, que será anexada por xargs
ao comando find
. Então xargs
executa o comando find
que construiu. O resultado é armazenado diretamente no arquivo st_$Region
.
Bem. Mas como vamos construir ${Region}_filesnotfound_$date.txt
, a lista de arquivos que não foram encontrados? Apenas cruzando a lista original completa com a lista de arquivos encontrados:
comm -3 \
<(sort -u "${Region}_${date}.txt") \
<(xargs -L1 basename < "${runDir}/st_$Region" | sort -u) \
> "${Region}_filesnotfound_$date.txt"
comm -3
suprime as linhas comuns entre os dois arquivos. Esses são pseudo-arquivos, na verdade. O segundo arquivo é o resultado do comando basename
aplicado a cada arquivo encontrado. Ambos os arquivos são classificados.
com find
+ grep
Outra solução é grep
dos nomes de arquivos da saída de find
. grep
oferece a possibilidade (através da opção -f
) de pesquisar uma série de padrões armazenados em um arquivo. Nós temos uma série de nomes de arquivos em um arquivo. Vamos criar uma lista de padrões e alimentá-la com grep
:
find "$DataDir" \
| grep -f <(sed 's|.*|/&$|' "${Region}_${date}.txt") \
> "${runDir}/st_$Region"
O comando sed
é obrigatório: ele ancora o nome do arquivo para pesquisar no final do caminho.
Quanto à lista de arquivos ausentes, ela seria construída da mesma maneira que a outra solução.
O problema com esta solução é que os nomes de arquivos podem conter caracteres que podem ser interpretados por grep
: .
, *
, [
, etc. Nós teríamos que escapar deles com sed
(deixo como um exercício para o leitor). É por isso que a primeira solução é ser a preferida da IMHO.
Por fim, observe que usei bash
isms aqui (por exemplo, processar subestações <(...)
). Não espere que nenhuma das minhas soluções seja compatível com POSIX.