Eu tenho uma longa lista de nomes de arquivos como 20231121_150111.jpg
... em um arquivo de texto (um nome de arquivo por linha).
E outra lista de diretórios. Esses diretórios contêm arquivos.
Como posso verificar e mostrar quais arquivos da minha lista não existem em nenhum dos diretórios?
: editar
nomes de arquivos.txt:
20230326_163243.jpg
20230326_163244.jpg
20230326_163245.jpg
....
crie com "ls -1"
diretórios.txt:
./2017/2017_3/DSC_0559.JPG
./2017/2017_3/DSC_0067.JPG
./2017/2017_3/DSC_0195.JPG
....
crie com "find ./ > directory.txt"
se eu executar o script no bash
#! /bin/bash -
readarray -td '' missing < <(
export LC_ALL=C
comm -z -23 <(<filenames.txt tr '\n' '\0' | sort -zu) \
<(<directories.txt tr '\n' '\0' |
sort -zu |
find -H -files0-from - -mindepth 1 -maxdepth 1 -printf '%f\0' |
sort -zu
)
)
if (( ${#missing[@]} )); then
printf '%s\n' "Couldn't find:"
printf ' - %s\n' "${missing[@]}"
fi
vejo muitos resultados de:
- 20230716_103851.jpg
- 20230716_103852(0).jpg
- 20230716_103852.jpg
....
meus nomes de arquivos e diretórios estão errados? ou o que estou fazendo de errado?
eu tenho uma pasta com muitas subpastas e imagens nela. eu tenho uma outra pasta com muitos arquivos jpg. a maioria dos arquivos jpg está em subpastas, mas não todos. preciso de uma maneira de mostrar o que não está nas subpastas
filenames.txt: muitos arquivos jpg
directories.txt : as subpastas com a maioria dos arquivos nela
É muito mais fácil em
zsh
:Se você tiver sua lista de nomes de arquivos
filenames.txt
e lista de diretórios emdirectories.txt
:Com
bash
, você pode fazer algo próximo se estiver em um sistema GNU recente com:Deixando de lado a consideração de que um arquivo PODE estar no diretório errado e assumindo que você está começando com uma lista APENAS de nomes de arquivos/não de caminhos, a solução mais eficiente seria obter uma lista dos nomes de arquivos que você possui (eu use
find ... -basename {} \;
para isso) classifique isso, classifique a lista de arquivos que você espera e compare-os usandodiff
.(Desculpe @Marcus Müller - executar uma nova pesquisa para cada arquivo não é uma solução muito econômica)
Supondo que não haja novas linhas nos nomes dos arquivos, provavelmente isso é tudo que você precisa:
assumindo que
yourfiles
contém sua lista de nomes de arquivos eyourdirs
sua lista de nomes de diretórios.