a abordagem do allo para ler o conteúdo dos diretórios uma vez, analisar os dados do texto e excluir os arquivos no final parece bom. No entanto, essa resposta parece não reconhecer a diferença entre nomes de arquivos nos dois diretórios ( blur
vs. fine
).
Seus arquivos são nomeados de acordo com padrões, portanto, seus nomes não devem incluir surpresas desagradáveis como caracteres não imprimíveis, novas linhas ou mais. Analisar ls
deve ser seguro, mas, em geral, não se deve fazê-lo . Gostaria de fornecer uma solução geral para não analisar ls
aqui. Eu vou usar strings terminadas em null, daí as opções como -print0
e -z
all over.
Vamos começar. Você só precisa ajustar os caminhos nas declarações de variáveis, a menos que você copie para outro (s) sistema (s) de arquivos. Em caso afirmativo, você também deve ajustar cp -l
. Leia os comentários primeiro. Eu aconselho você a colar o código inteiro em um arquivo, ajustar e, em seguida, fonte ou executá-lo.
#/bin/bash
# Declare variables.
dir1="/your/directory1/"
dir2="/your/directory2/"
dir3="/your/new/directory3/" # Use absolute paths at least for dir3...
dir4="/your/new/directory4/" # and dir4.
core1=blur
core2=fine
# Create temporary file.
tmpf=$(mktemp)
# Get null-terminated local paths from dir1.
# Note the line doesn't end yet thanks to \.
{ (cd "$dir1"; find -maxdepth 1 -type f -iname "*${core1}*" -print0) ; \
# Add null-terminated local paths from dir2
# (the line continues because of the trailing |)
(cd "$dir2"; find -maxdepth 1 -type f -iname "*${core2}*" -print0) |
# but convert core2 to core1, so the names are all with core1.
# Note the output of the two finds is gathered by {} and piped...
sed -z "s|${core2}|${core1}|" ; } |
# ...to sort and uniq. With uinq -d we print only duplicates, only once.
sort -z | uniq -zd > "$tmpf"
# Note how long this one line was.
# At this moment tmpf lists all the files we need to copy to dir3.
# The filenames are local to dir1, so we have to cd temporarily.
# dir3 will be resolved from dir1, that's why I told to use absolute paths.
# I assume the same filesystem. Creating hardlinks instead of copying;
# remove -l option to do regular copy. Hardlinking.
(cd "$dir1"; xargs -0 -a "$tmpf" cp -alt "$dir3")
# Convert core1 to core2 in tmpf in place.
sed -zi "s|${core1}|${core2}|" "$tmpf"
# Hardlinking from dir2 to dir4.
(cd "$dir2"; xargs -0 -a "$tmpf" cp -alt "$dir4")
# Remove the temporary file.
rm "$tmpf"